Merge pull request #5 from IcyNet/redesign

Redesign
This commit is contained in:
Evert Prants 2018-02-07 19:07:31 +02:00 committed by GitHub
commit 53990223a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 974 additions and 770 deletions

View File

@ -1,4 +1,4 @@
<div class="tos"> <div>
<h1>Privacy Policy</h1> <h1>Privacy Policy</h1>
<span class="last-modified">Last modified: Friday, 13 Oct 2017</span> <span class="last-modified">Last modified: Friday, 13 Oct 2017</span>
<p>By using Services of Icy Network, you acknowledge and agree to these policies.</p> <p>By using Services of Icy Network, you acknowledge and agree to these policies.</p>

View File

@ -1,4 +1,4 @@
<div class="tos"> <div>
<h1>Terms of Service</h1> <h1>Terms of Service</h1>
<span class="last-modified">Last modified: Wednesday, 03 Jan 2018</span> <span class="last-modified">Last modified: Wednesday, 03 Jan 2018</span>
<p>Please read the following Terms and Conditions carefully. By using Icy Network services, you signify that you have read, understood and agreed to be bound by these Terms and Conditions. Icy Network reserves the right to modify, replace or remove any of the Terms and Conditions written in this document at any given time without restrictions. We will try to notify you of any such amendments. If you do not agree to these Terms and Conditions, you may not use any of the services provided by Icy Network.</p> <p>Please read the following Terms and Conditions carefully. By using Icy Network services, you signify that you have read, understood and agreed to be bound by these Terms and Conditions. Icy Network reserves the right to modify, replace or remove any of the Terms and Conditions written in this document at any given time without restrictions. We will try to notify you of any such amendments. If you do not agree to these Terms and Conditions, you may not use any of the services provided by Icy Network.</p>

12
package-lock.json generated
View File

@ -962,6 +962,12 @@
"hoek": "4.2.0" "hoek": "4.2.0"
} }
}, },
"bootstrap": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0.tgz",
"integrity": "sha512-gulJE5dGFo6Q61V/whS6VM4WIyrlydXfCgkE+Gxe5hjrJ8rXLLZlALq7zq2RPhOc45PSwQpJkrTnc2KgD6cvmA==",
"dev": true
},
"brace-expansion": { "brace-expansion": {
"version": "1.1.8", "version": "1.1.8",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
@ -5690,6 +5696,12 @@
"integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=",
"dev": true "dev": true
}, },
"popper.js": {
"version": "1.12.9",
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.12.9.tgz",
"integrity": "sha1-DfvC3/lsRRuzMu3Pz6r1ZtMx1bM=",
"dev": true
},
"postcss": { "postcss": {
"version": "6.0.14", "version": "6.0.14",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz",

View File

@ -62,11 +62,13 @@
"devDependencies": { "devDependencies": {
"babel-loader": "^7.1.2", "babel-loader": "^7.1.2",
"babel-preset-env": "^1.6.1", "babel-preset-env": "^1.6.1",
"bootstrap": "^4.0.0",
"concurrently": "^3.5.1", "concurrently": "^3.5.1",
"eslint-plugin-import": "^2.8.0", "eslint-plugin-import": "^2.8.0",
"jquery": "^3.2.1", "jquery": "^3.2.1",
"morgan": "^1.9.0", "morgan": "^1.9.0",
"mustache": "^2.3.0", "mustache": "^2.3.0",
"popper.js": "^1.12.9",
"standard": "^10.0.3", "standard": "^10.0.3",
"uglifyjs-webpack-plugin": "^1.1.2", "uglifyjs-webpack-plugin": "^1.1.2",
"vue-clickaway": "^2.1.0", "vue-clickaway": "^2.1.0",

View File

@ -1,12 +1,15 @@
import gm from 'gm' import gm from 'gm'
import url from 'url' import url from 'url'
import path from 'path' import path from 'path'
import crypto from 'crypto'
import uuid from 'uuid/v4' import uuid from 'uuid/v4'
import http from '../../scripts/http' import http from '../../scripts/http'
const fs = require('fs-extra') const fs = require('fs-extra')
const gravatar = 'https://www.gravatar.com/avatar/'
const uploads = path.join(__dirname, '../../', 'usercontent') const uploads = path.join(__dirname, '../../', 'usercontent')
const images = path.join(uploads, 'images') const images = path.join(uploads, 'images')
const maxFileSize = 1000000 const maxFileSize = 1000000
@ -72,6 +75,11 @@ async function imageBase64 (baseObj) {
return {file: fpath} return {file: fpath}
} }
function gravatarURL (email) {
let sum = crypto.createHash('md5').update(email).digest('hex')
return gravatar + sum + '.jpg'
}
async function downloadImage (imgUrl, designation) { async function downloadImage (imgUrl, designation) {
if (!imgUrl) return null if (!imgUrl) return null
if (!designation) designation = 'download' if (!designation) designation = 'download'
@ -166,5 +174,6 @@ module.exports = {
downloadImage: downloadImage, downloadImage: downloadImage,
uploadImage: uploadImage, uploadImage: uploadImage,
imageBase64: imageBase64, imageBase64: imageBase64,
gravatarURL: gravatarURL,
types: imageTypes types: imageTypes
} }

View File

@ -380,6 +380,7 @@ router.post('/avatar', uploadLimiter, wrap(async (req, res, next) => {
req.session.user.avatar_file = avatarFile req.session.user.avatar_file = avatarFile
} }
req.flash('message', {error: false, text: 'Success!'})
res.status(200).jsonp({}) res.status(200).jsonp({})
})) }))
@ -417,6 +418,32 @@ router.get('/avatar/:id', wrap(async (req, res, next) => {
res.redirect('/usercontent/images/' + user.avatar_file) res.redirect('/usercontent/images/' + user.avatar_file)
})) }))
router.get('/avatar/gravatar', (req, res, next) => {
if (!req.session.user) return next()
let email = req.session.user.email
res.set('Content-Type', 'text/plain')
res.end(Image.gravatarURL(email))
})
router.post('/avatar/gravatar', wrap(async (req, res, next) => {
if (!req.session.user) return next()
let user = req.session.user
try {
let gravURL = await Image.downloadImage(Image.gravatarURL(user.email), 'GRAV-' + user.username)
let file = await API.User.changeAvatar(user, gravURL)
req.session.user.avatar_file = file
req.flash('message', {error: false, text: 'Success!'})
} catch (e) {
req.flash('message', {error: true, text: 'Failed to use gravatar avatar.'})
}
res.jsonp({})
}))
// Redirect to no avatar on 404 // Redirect to no avatar on 404
router.use('/avatar', (req, res) => { router.use('/avatar', (req, res) => {
res.redirect('/static/image/avatar.png') res.redirect('/static/image/avatar.png')

View File

@ -1,4 +1,6 @@
window.$ = require('jquery') window.$ = window.jQuery = require('jquery')
window.Popper = require('popper.js')
require('bootstrap')
$(document).ready(function () { $(document).ready(function () {
function pwcheck (e) { function pwcheck (e) {
@ -201,11 +203,10 @@ $(document).ready(function () {
var html = '' var html = ''
for (var i in data) { for (var i in data) {
var article = data[i] var article = data[i]
html += '<div class="prvarticle">' html += '<div class="news-article">'
html += '<a class="title" href="/news/' + article.id + '-' + article.slug + '">' + article.title + '</a>' html += '<h2 class="news-title"><a href="/news/' + article.id + '-' + article.slug + '">' + article.title + '</a></h2>'
html += '<span class="timestamp">Published at ' + new Date(article.created_at) + '</span>' html += '<p class="news-meta">Published at ' + new Date(article.created_at) + '</p>'
html += '<div class="prvcontent">' + article.description + '</div>' html += '<div class="news-content">' + article.content + '</div>'
html += '<a href="/news/' + article.id + '-' + article.slug + '">Read More</a>'
html += '</div>' html += '</div>'
} }
$('.newsfeed').html(html) $('.newsfeed').html(html)
@ -244,12 +245,7 @@ $(document).ready(function () {
}) })
} }
if ($('#newAvatar').length) { if ($('#removeAvatar').length) {
$('#newAvatar').click(function (e) {
e.preventDefault()
window.Dialog.openPartial('Change Avatar', 'avatar')
})
$('#removeAvatar').click(function (e) { $('#removeAvatar').click(function (e) {
e.preventDefault() e.preventDefault()
$.ajax({ $.ajax({
@ -303,7 +299,7 @@ $(document).ready(function () {
}) })
} }
$('.loginDiag').click(function (e) { $('.login-dialog-pop').click(function (e) {
e.preventDefault() e.preventDefault()
var url = $(this).attr('href') var url = $(this).attr('href')
var popup = PopupCenter(url, '_blank', 800, 620) var popup = PopupCenter(url, '_blank', 800, 620)

View File

@ -1,5 +1,6 @@
body body
margin: 0 margin: 0
font-family: sans-serif
nav nav
display: block display: block

View File

@ -1,22 +1,6 @@
body body
margin: 0 margin: 0
color: black color: black
font-family: sans-serif
/*background-color: #82fff4;
background-image: linear-gradient(-45deg, #80d7ff 25%, transparent 25.5%, transparent 50%,
#80d7ff 50.5%, #80d7ff 75%, transparent 75.5%, transparent)
height: 100vh;
background-size: 50px 50px;*/
background: #6fefff
background: -moz-linear-gradient(top, #6fefff 0%, #53cbf1 51%, #05abe0 100%)
background: -webkit-linear-gradient(top, #6fefff 0%,#53cbf1 51%,#05abe0 100%)
background: linear-gradient(to bottom, #6fefff 0%,#53cbf1 51%,#05abe0 100%)
a
color: green
text-decoration: none
&:hover
text-decoration: underline
.logo .logo
font-size: 8vw font-size: 8vw
@ -109,30 +93,44 @@ a
&:checked ~ .list &:checked ~ .list
max-height: 500px max-height: 500px
section .carousel
font-family: "Open Sans" margin-bottom: 4rem
position: relative
min-height: 100vh .carousel-item
.content height: 40rem
position: absolute background-color: #777
left: 0
right: 0 & > img
top: 0 position: absolute
bottom: 40% top: 0
overflow: auto left: 0
background-color: #ffffff min-width: 100%
padding: 20px height: 40rem
&#home
h1 .marketing .col-lg-4
font-size: 300% margin-bottom: 1.5rem
text-align: center text-align: center
color: green
margin-bottom: 0 .circular-header
p width: 140px
text-align: center; height: 140px
font-size: 200% vertical-align: middle
color: #0074d0; display: inline-block
font-weight: bold; border-radius: 50% !important
line-height: 9rem
font-size: 5rem
color: #fff
.news-article
margin-bottom: 4rem
.news-title
margin-bottom: .25rem
font-size: 2.5rem
.news-meta
margin-bottom: 1.25rem
color: #999
.divboxes .divboxes
text-align: center text-align: center
@ -178,35 +176,6 @@ section
code code
white-space: pre white-space: pre
label
display: block
margin-top: 20px
input:not([type="submit"])
padding: 5px
font-size: 120%
border-radius: 5px
border: 1px solid #c1c1c1
background-color: #f5f5f5
color: #000
box-shadow: inset 2px 2px 5px #ddd
transition: border 0.1s linear
button, .button, input[type="submit"]
display: block
padding: 5px 10px
background-color: #fbfbfb
color: #000
border: 1px solid #c1c1c1
border-radius: 5px
font-size: 120%
margin: 10px 0
cursor: pointer
&.active
background-color: #ddd
input[disabled]
color: #959595
.button .button
display: inline-block display: inline-block
@ -260,8 +229,8 @@ input[disabled]
color: #a9a9a9 color: #a9a9a9
font-style: italic font-style: italic
.dlbtn .app-button
display: block display: inline-block
img img
width: 200px width: 200px
&.apple &.apple
@ -269,71 +238,65 @@ input[disabled]
width: 175px width: 175px
padding: 0 12px padding: 0 12px
.twitterLogin .login-btn
display: block display: block
padding: 10px
width: 215px
margin-top: 5px
background-color: #fff
border: 1px solid #ddd
border-radius: 5px
text-decoration: none text-decoration: none
i border-radius: 5px
color: #03A9F4
font-size: 22px
span
color: #000
display: inline-block
vertical-align: top
margin-top: 3px
margin-left: 12px
.discordLogin
display: block
background-color: #99AAB5
width: 225px
height: 40px
margin-top: 5px margin-top: 5px
padding: 5px 5px padding: 5px 5px
border-radius: 5px
text-decoration: none
span
color: white
vertical-align: top
margin-top: 11px
margin-left: 3px
display: inline-block
img
width: 45px
display: inline-block
.googleLogin
padding: 10px
width: 215px width: 215px
margin-top: 5px height: 50px
background-color: #4285f4
border: 1px solid #ddd
border-radius: 5px
text-decoration: none
display: block
cursor: pointer cursor: pointer
i margin-left: 5px
color: #fff
font-size: 22px
span
color: #fff
display: inline-block
vertical-align: top
margin-top: 3px
margin-left: 12px
.accdisconnect &.twitter-login
margin-top: 5px background-color: #fff
padding: 10px border: 1px solid #ddd
background-color: #ff6c6c line-height: 2.2rem
color: #fff
width: 215px i
border-radius: 5px color: #03A9F4
font-size: 22px
span
color: #000
display: inline-block
vertical-align: top
margin-left: 12px
&.discord-login
background-color: #99aab5
line-height: 2.4rem
span
color: white
vertical-align: top
margin-left: 3px
display: inline-block
img
width: 45px
display: inline-block
&.google-login
background-color: #4285f4
border: 1px solid #ddd
line-height: 2.2rem
i
color: #fff
font-size: 22px
span
color: #fff
display: inline-block
vertical-align: top
margin-left: 12px
&.disconnect
margin-top: 5px
padding: 10px
background-color: #ff6c6c
color: #fff
width: 215px
border-radius: 5px
span.divider span.divider
color: #ddd color: #ddd
@ -462,9 +425,6 @@ span.load
.prvcontent .prvcontent
margin: 10px 0 margin: 10px 0
.return
margin-top: 40px
.content .content
hr hr
border-color: #ffffff border-color: #ffffff
@ -665,6 +625,39 @@ noscript
width: 100vw !important width: 100vw !important
min-width: 100vw !important min-width: 100vw !important
.btn-social
width: 28px
height: 28px
display: block
line-height: 28px
color: #fff
font-size: 120%
border-radius: 100px
padding: 0 2px
margin: 5px
&#github
background-color: #000
&#twitter
background-color: #03a9f4
&#discord
background-color: #2C2F33
padding: 3px
span
background: url("/static/image/discord.svg")
background-size: contain
width: 22px
height: 22px
display: block
&#rocket-chat
background-color: #eee
padding: 3px
span
background: url("/static/image/rocket-chat.svg")
background-size: contain
width: 22px
height: 22px
display: block
@media all and (max-width: 500px) @media all and (max-width: 500px)
section section
padding: 10px padding: 10px

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_5" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<path fill="#CC3333" d="M491.3,255.3c0-24.1-7.2-47.2-21.4-68.7c-12.8-19.3-30.7-36.4-53.2-50.7c-43.5-27.8-100.6-43.1-160.9-43.1 c-20.1,0-40,1.7-59.2,5.1c-11.9-11.2-25.9-21.2-40.7-29.2c-79-38.3-144.6-0.9-144.6-0.9s60.9,50.1,51,93.9c-27.3,27-42,59.6-42,93.6 c0,0.1,0,0.2,0,0.3c0,0.1,0,0.2,0,0.3c0,33.9,14.8,66.6,42,93.6c9.9,43.9-51,93.9-51,93.9s65.5,37.4,144.6-0.9 c14.8-8,28.8-18,40.7-29.2c19.2,3.4,39.1,5.1,59.2,5.1c60.3,0,117.4-15.3,160.9-43.1c22.5-14.4,40.4-31.5,53.2-50.7 c14.2-21.5,21.4-44.6,21.4-68.7c0-0.1,0-0.2,0-0.3C491.3,255.6,491.3,255.4,491.3,255.3z"/>
<path fill="#FFFFFF" d="M255.9,124.2c113.9,0,206.3,59,206.3,131.8c0,72.8-92.4,131.8-206.3,131.8c-25.4,0-49.7-2.9-72.1-8.3 c-22.8,27.4-73,65.6-121.7,53.3c15.9-17,39.4-45.8,34.3-93.2c-29.2-22.7-46.8-51.8-46.8-83.5C49.6,183.2,142,124.2,255.9,124.2"/>
<g>
<g>
<circle fill="#CC3333" cx="255.9" cy="256" r="27.4"/>
</g>
<g>
<circle fill="#CC3333" cx="351.2" cy="256" r="27.4"/>
</g>
<g>
<circle fill="#CC3333" cx="160.6" cy="256" r="27.4"/>
</g>
</g>
<g>
<path fill="#CCCCCC" d="M255.8,372.8c-25.4,0-56.2-4.9-78.7-9.5c-20.1,21-53.7,52.7-99.6,50.3c-5.7,8.6-10.2,13.5-15.5,19.2 c48.7,12.3,98.9-25.8,121.7-53.3c22.4,5.4,46.7,8.3,72.1,8.3c113,0,204.8-58.1,206.3-130C460.7,320.1,368.8,372.8,255.8,372.8z"/>
<path fill="none" stroke="#000000" stroke-miterlimit="10" d="M172,350.9"/>
<path fill="none" stroke="#000000" stroke-miterlimit="10" d="M200.4,422.9"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -3,7 +3,6 @@ html
meta(charset="utf8") meta(charset="utf8")
meta(name="csrf-token", content=csrf) meta(name="csrf-token", content=csrf)
block links block links
link(rel="stylesheet", type="text/css", href="https://fonts.googleapis.com/css?family=Open+Sans")
link(rel="stylesheet", type="text/css", href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css") link(rel="stylesheet", type="text/css", href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css")
link(rel="stylesheet", type="text/css", href="/style/main.css") link(rel="stylesheet", type="text/css", href="/style/main.css")
link(rel="stylesheet", type="text/css", href="/style/admin.css") link(rel="stylesheet", type="text/css", href="/style/admin.css")

View File

@ -1,61 +1,63 @@
extends layout extends layout
block title block title
|Icy Network - Authorize Client |Icy Network - Authorize Application
block body block body
.wrapper .container.mb-4.mt-4
.boxcont h1 Authorize Application
.box#login p
h1 Authorize OAuth2 Application b= client.title
.left | wants you to give them access to your user details and authenticate you, without giving them your password. The list of things
.application b=client.title
.picture | can and cannot do are provided below.
if client.icon .row.mb-2
img(src=client.icon) .col
else .application
.noicon .picture
i.fa.fa-fw.fa-gears if client.icon
.info img(src=client.icon)
.name= client.title else
.description= client.description .noicon
a.url(href=client.url, target="_blank", rel="nofollow")= client.url
form#loginForm(method="POST", action="")
input(type="hidden", name="csrf", value=csrf)
input(type="hidden", name="decision", value='1')
input.authorize(type="submit", value="Authorize")
form#loginForm(method="POST", action="")
input(type="hidden", name="csrf", value=csrf)
input(type="hidden", name="decision", value='0')
input.deny(type="submit", value="Deny")
.right
.haveaccess
span This application can
ul.nobulletin
if scope.indexOf('email') !== -1
li
i.fa.fa-fw.fa-envelope
|See your Email address
li
i.fa.fa-fw.fa-user
|See your Display Name
.noaccess
span This application cannot
ul.nobulletin
if scope.indexOf('email') === -1
li
i.fa.fa-fw.fa-envelope
|See your Email address
li
i.fa.fa-fw.fa-lock
|See your Password
li
i.fa.fa-fw.fa-gears i.fa.fa-fw.fa-gears
|Change your Account Settings .info
if client.verified != 1 .name= client.title
.unaffiliated .description= client.description
br a.url(href=client.url, target="_blank", rel="nofollow")= client.url
span form(method="POST", action="")
i.fa.fa-fw.fa-warning input(type="hidden", name="csrf", value=csrf)
|This application is not affiliated with Icy Network input(type="hidden", name="decision", value='1')
i.fa.fa-fw.fa-warning button.btn.btn-success(type="submit") Authorize Access
p
form(method="POST", action="")
input(type="hidden", name="csrf", value=csrf)
input(type="hidden", name="decision", value='0')
button.btn.btn-danger(type="submit") Deny Access
.col
.haveaccess
span This application can
ul.nobulletin
if scope.indexOf('email') !== -1
li
i.fa.fa-fw.fa-envelope
|See your Email address
li
i.fa.fa-fw.fa-user
|See your Display Name
.noaccess
span This application cannot
ul.nobulletin
if scope.indexOf('email') === -1
li
i.fa.fa-fw.fa-envelope
|See your Email address
li
i.fa.fa-fw.fa-lock
|See your Password
li
i.fa.fa-fw.fa-gears
|Change your Account Settings
.alert.alert-info
b Note!
|You can revoke #{client.title} at any time from your
a(href="/user/manage") Account Settings
|.

View File

@ -4,5 +4,5 @@ block title
|Icy Network |Icy Network
block body block body
.document .container.mt-4
.content !{doc} .content !{doc}

View File

@ -3,43 +3,43 @@ block title
|Icy Network - Donate |Icy Network - Donate
block body block body
.wrapper .container.mb-4.mt-4
.boxcont h1 Donate
.box#donate p Donations help us pay for the servers required to keep Icy Network running. Donating any amount would be highly appreciated!
h1 Donate
p Donations help us pay for the services required to keep Icy Network running. Donating any amount would be highly appreciated! - var formurl = "https://www.paypal.com/cgi-bin/webscr"
if sandbox
- var formurl = "https://www.paypal.com/cgi-bin/webscr" - formurl = "https://www.sandbox.paypal.com/cgi-bin/webscr"
if sandbox
- formurl = "https://www.sandbox.paypal.com/cgi-bin/webscr" form(action=formurl, method="post")
input(type="hidden" name="cmd" value="_xclick")
form(action=formurl, method="post") input(type="hidden" name="business" value=business)
input(type="hidden" name="cmd" value="_xclick") input(type="hidden" name="item_name" value=name)
input(type="hidden" name="business" value=business) input(type="hidden" name="item_number" value="1")
input(type="hidden" name="item_name" value=name) input(type="hidden" name="no_shipping" value="1")
input(type="hidden" name="item_number" value="1") input(type="hidden" name="quantity" value="1")
input(type="hidden" name="no_shipping" value="1") input(type="hidden" name="tax" value="0")
input(type="hidden" name="quantity" value="1") input(type="hidden" name="notify_url" value=ipn_url)
input(type="hidden" name="tax" value="0") label(for="amount") Amount
input(type="hidden" name="notify_url" value=ipn_url) .row.form-group
label(for="amount") Amount .col-10
input(type="number", name="amount" value="1.00") input.form-control(type="number", name="amount" value="1.00")
select(name="currency_code") .col
select.form-control(name="currency_code")
option(value="EUR") EUR option(value="EUR") EUR
option(value="USD") USD option(value="USD") USD
if user if user
input#custominfo(type="hidden", name="custom", value="userid:" + user.id) input#custominfo(type="hidden", name="custom", value="userid:" + user.id)
else else
input#custominfo(type="hidden", name="custom", value="") input#custominfo(type="hidden", name="custom", value="")
if minecraft if minecraft
.check .form-check.form-check-inline
label(for="mcinclude") Include Minecraft Username input.form-check-input(id="mcinclude" type="checkbox" checked="false")
input(id="mcinclude" type="checkbox") label.form-check-label(for="mcinclude") Include Minecraft Username
.mcuname(style="display: none;") .mcuname.form-group(style="display: none;")
input(id="mcusername", autocomplete="off") label(for="mcusername") Minecraft Username
.buttoncont input.form-control(id="mcusername", autocomplete="off")
a.button.donate(name="submit", onclick="$(this).closest('form').submit()") .buttoncont
i.fa.fa-fw.fa-paypal a.btn.btn-primary.text-light(name="submit", onclick="$(this).closest('form').submit()")
|Donate i.fa.fa-fw.fa-paypal
br |&nbsp;Donate
b Currently you can only donate using PayPal.

View File

@ -1,6 +1,6 @@
.avatar .avatar
if user.avatar_file if user.avatar_file
img(src="/usercontent/images/" + user.avatar_file) img#userAvatarFile(src="/usercontent/images/" + user.avatar_file)
else else
.noavatar .noavatar
i.fa.fa-fw.fa-user i.fa.fa-fw.fa-user

View File

@ -22,7 +22,7 @@
fb:login-button(scope="public_profile,email", onlogin="checkLoginState();" data-max-rows="1", data-size="large", data-button-type="login_with", data-show-faces="false", data-auto-logout-link="false", data-use-continue-as="false") fb:login-button(scope="public_profile,email", onlogin="checkLoginState();" data-max-rows="1", data-size="large", data-button-type="login_with", data-show-faces="false", data-auto-logout-link="false", data-use-continue-as="false")
if google_auth if google_auth
script(src="https://apis.google.com/js/api:client.js") script(src="https://apis.google.com/js/api:client.js")
a.googleLogin a.login-btn.google-login.float-lg-right
i.fa.fa-fw.fa-google i.fa.fa-fw.fa-google
span Log in With Google span Log in With Google
script. script.
@ -35,7 +35,7 @@
cookiepolicy: 'single_host_origin', cookiepolicy: 'single_host_origin',
fetch_basic_profile: true fetch_basic_profile: true
}); });
attachSignin(document.querySelector('.googleLogin')); attachSignin(document.querySelector('.google-login'));
}); });
}; };
@ -60,10 +60,10 @@
startApp() startApp()
if twitter_auth if twitter_auth
a.twitterLogin.loginDiag(href="/api/external/twitter/login") a.login-btn.twitter-login.login-dialog-pop.float-lg-right(href="/api/external/twitter/login")
i.fa.fa-fw.fa-twitter i.fa.fa-fw.fa-twitter
span Log in With Twitter span Log in With Twitter
if discord_auth if discord_auth
a.discordLogin.loginDiag(href="/api/external/discord/login") a.login-btn.discord-login.login-dialog-pop.float-lg-right(href="/api/external/discord/login")
img(src="/static/image/Discord-Logo-White.svg") img(src="/static/image/Discord-Logo-White.svg")
span Log in With Discord span Log in With Discord

View File

@ -3,25 +3,46 @@ block title
|Icy Network |Icy Network
block body block body
section#home .carousel.slide#myCarousel(data-ride="carousel")
.content ol.carousel-indicators
h1 Welcome to Icy Network! li.active(data-target="#myCarousel" data-slide-to="0")
p Icy Network is a Global Network of Communities and Websites, United by a Single Login li(data-target="#myCarousel" data-slide-to="1")
.divboxes .carousel-inner
.divbox#secure .carousel-item.active
span.head img.first-slide(src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==", alt="First Slide")
i.fa.fa-lock.fa-fw .container
span.text Secure Login .carousel-caption.text-left
span.text A secure login system with Two-Factor Authentication possibility h1 Welcome to Icy Network
.divbox#secure p Icy Network is a Global Network of Communities and Websites, United by a Single Login
span.head //a.btn.btn-lg.btn-primary(href="#" role="button") Learn More
i.fa.fa-github.fa-fw .carousel-item
span.text Open Source img.second-slide(src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==", alt="Second Slide")
span.text All of our platforms are Open Source Software hosted on our .container
a(href="https://github.com/IcyNet", target="_blank") GitHub Organization .carousel-caption.text-left
section#news h1 Join our Minecraft Server
.content p We have a Minecraft Server up at mc.icynet.eu, join now!
h1 Icy Network News a.carousel-control-prev(href="#myCarousel" role="button" data-slide="prev")
.newsfeed span.carousel-control-prev-icon(aria-hidden="true")
p Please enable JavaScript to view this content. span.sr-only Previous
a.older(href="/news") View all articles a.carousel-control-next(href="#myCarousel" role="button" data-slide="next")
span.carousel-control-next-icon(aria-hidden="true")
span.sr-only Next
.container.marketing
.row
.col-lg-4
span.circular-header.bg-warning
i.fa.fa-fw.fa-lock
h2 Secure Login
p We have a secure login system with the possibility to even further secure your account with Two-Factor Authentication.
.col-lg-4
span.circular-header.bg-success
i.fa.fa-fw.fa-github
h2 Open Source
p All of our services are Free and Open Source Software (FOSS) hosted on GitHub.
p
a.btn.btn-secondary(href="https://github.com/IcyNet", target="_blank") Browse Repositories
.col-lg-4
span.circular-header.bg-info
i.fa.fa-fw.fa-users
h2 Community-oriented
p Our services are made to serve communities. We unite them all with a single login system with support for multiple authentication protocols.

View File

@ -2,7 +2,7 @@ doctype html
html html
head head
meta(charset="utf8") meta(charset="utf8")
meta(name="viewport", content="width=device-width, initial-scale=1") meta(name="viewport", content="width=device-width, initial-scale=1, shrink-to-fit=no")
block meta block meta
meta(name="og:title", content="Icy Network") meta(name="og:title", content="Icy Network")
meta(name="og:description", content="Icy Network is a Global Network of Communities and Websites, United by a Single Login") meta(name="og:description", content="Icy Network is a Global Network of Communities and Websites, United by a Single Login")
@ -27,9 +27,8 @@ html
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s); g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})(); })();
block links block links
link(rel="stylesheet", type="text/css", href="//maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css")
link(rel="stylesheet", type="text/css", href="/style/main.css") link(rel="stylesheet", type="text/css", href="/style/main.css")
link(rel="stylesheet", type="text/css", href="/style/footer.css")
link(rel="stylesheet", type="text/css", href="//fonts.googleapis.com/css?family=Open+Sans")
link(rel="stylesheet", type="text/css", href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css") link(rel="stylesheet", type="text/css", href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css")
script(src="/script/main.js") script(src="/script/main.js")
block cookieconsent block cookieconsent
@ -59,69 +58,53 @@ html
p Please consider enabling JavaScript for the full experience. p Please consider enabling JavaScript for the full experience.
if matomo if matomo
p p
img(src="#{matomo.track_url}piwik.php?idsite=1&rec=1" style="border:0;" alt="") img.d-inline-block.align-top(src="#{matomo.track_url}piwik.php?idsite=1&rec=1" style="border:0;" alt="")
block banner
.banner
.logo
.part1 Icy
.part2 Network
block dialog
.dialog-drop#dialog
.dialog
.head
#title
#close
i.fa.fa-fw.fa-times
.content#content
block nav block nav
.anchor nav.navbar.navbar-expand-lg.navbar-light.bg-light.sticky-top
nav.navigator a.navbar-brand(href="/")
li.hidden#navlogo img(src="/static/image/icynet-icon.svg" width="30" heigth="30")
a(href="/") |Icy Network
.logo.small
.part1 Icy button.navbar-toggler(type="button" data-toggle="collapse" data-target="#navCollapse" aria-controls="navCollapse" aria-expanded="false" aria-label="Toggle navigation")
.part2 Network span.navbar-toggler-icon
.menu
label.showButton(for="show-menu") .navbar-collapse.collapse#navCollapse
i.fa.fa-fw.fa-bars ul.mr-auto.navbar-nav
input(type="checkbox" id="show-menu") li.nav-item
.list a.nav-link(href="/") Home
ul li.nav-item
li a.nav-link(href="/news") News
a.scroll(href="/#home") Home li.nav-item
li a.nav-link(href="https://forum.icynet.eu/") Forum
a.scroll(href="/#news") News ul.navbar-nav.my-2.my-lg-0
li if user
a(href="https://forum.icynet.eu/") Forum li.nav-item
ul.floating a.nav-link(href="/user/manage") #{user.display_name}
if user li.nav-item
li#user a.nav-link(href="/logout") Log out
a(href="/user/manage") #{user.display_name} else
li li.nav-item
a(href="/logout") Log out a.nav-link(href="/login") Log in
else main(role="main")
li block body
a(href="/login") Log in block footer
block body //FOOTER
block footer footer.container.mb-4
footer p
img.squeebot(src="/static/image/squeebot.svg") |&copy; 2017-2018 Icy Network
span.copyright span.float-sm-right.ml-4
.logo.small a(href="/docs/terms-of-service") Terms
.part1 Icy | ·
.part2 Network a(href="/docs/privacy-policy") Privacy
.social | ·
a.socialbtn#github(href="https://github.com/IcyNet/" target="_blank") a(href="/donate") Donate
.d-flex.justify-content-center
a.btn-social#github(href="https://github.com/IcyNet/" target="_blank")
i.fa.fa-fw.fa-github i.fa.fa-fw.fa-github
a.socialbtn#twitter(href="https://twitter.com/IcyNet" target="_blank") a.btn-social#twitter(href="https://twitter.com/IcyNet" target="_blank")
i.fa.fa-fw.fa-twitter i.fa.fa-fw.fa-twitter
a.socialbtn#discord(href="https://discord.gg/Xe7MKSx" target="_blank") a.btn-social#discord(href="https://discord.gg/Xe7MKSx" target="_blank")
span.discordlogo span
span &copy; 2018 - Icy Network - Some Rights Reserved a.btn-social#rocket-chat(href="https://chat.icynet.eu" target="_blank")
br span
span
a(href="/docs/terms-of-service") Terms of Service
span.divider |
a(href="/docs/privacy-policy") Privacy Policy
span.divider |
a(href="/donate") Donate

View File

@ -24,45 +24,47 @@ block title
|Icy Network - News - 404 |Icy Network - News - 404
block body block body
.document .container.mt-4
.content if !article
if !article span.error No such article
span.error No such article else
else nav(aria-label="breadcrumb")
.article ol.breadcrumb
if user && user.privilege && user.privilege > 0 && !editing li.breadcrumb-item
a.button(style="float: right;" href="?edit=1") Edit a(href="/") Home
.title= article.title li.breadcrumb-item
.author Published by a(href="/news") News
span #{article.author.display_name} li.breadcrumb-item.active(aria-current="page")= article.title
|at
.timestamp #{new Date(article.created_at)} .news-article
if editing if user && user.privilege && user.privilege > 0 && !editing
.content(contenteditable="true" id="editor1")!= article.content a.btn.btn-primary.float-right(href="?edit=1") Edit
else h1.news-title= article.title
.content!= article.content p.news-meta Published by
if editing span #{article.author.display_name}
.button(id="done") Done editing |at #{new Date(article.created_at)}
br if editing
script. .content(contenteditable="true" id="editor1")!= article.content
CKEDITOR.disableAutoInline = true; else
CKEDITOR.inline('editor1'); .content!= article.content
$('#done').click(function (e) { if editing
let data = CKEDITOR.instances.editor1.getData(); .btn.btn-success(id="done") Done editing
$.post({ br
url: '/api/news/edit/#{article.id}', script.
data: {content: data}, CKEDITOR.disableAutoInline = true;
success: function () { CKEDITOR.inline('editor1');
window.location.href = '/news/#{article.id}-#{article.slug}' $('#done').click(function (e) {
}, let data = CKEDITOR.instances.editor1.getData();
error: function (e) { $.post({
if (e.responseJSON && e.responseJSON.error) { url: '/api/news/edit/#{article.id}',
alert(e.responseJSON.error); data: {content: data},
} success: function () {
window.location.href = '/news/#{article.id}-#{article.slug}'
},
error: function (e) {
if (e.responseJSON && e.responseJSON.error) {
alert(e.responseJSON.error);
} }
}); }
}); });
});
.return
a(href="/news") Back to the news archive

View File

@ -7,25 +7,34 @@ block title
|Icy Network - News - Compose |Icy Network - News - Compose
block body block body
.document .container.mt-4.mb-4
.content nav(aria-label="breadcrumb")
if message.text ol.breadcrumb
if message.error li.breadcrumb-item
.message.error a(href="/") Home
span #{message.text} li.breadcrumb-item
else a(href="/news") News
.message li.breadcrumb-item.active(aria-current="page") Compose
span #{message.text} if message.text
form(action="", method="post") if message.error
input(type="hidden", name="csrf", value=csrf) .alert.alert-danger
span #{message.text}
else
.alert.alert-warning
span #{message.text}
form(action="", method="post")
input(type="hidden", name="csrf", value=csrf)
.form-group
label(for="title") Title label(for="title") Title
input(type="text", name="title", id="title", value=formkeep.title) input.form-control(type="text", name="title", id="title", value=formkeep.title, aria-describedby="titleHelp")
small.form-text.text-muted#titleHelp Describe your article in a short sentence
.form-group
label(for="composer1") Content label(for="composer1") Content
textarea(name="content" id="composer1") #{formkeep.content} textarea.form-control(name="content" id="composer1") #{formkeep.content}
.form-group
label(for="tags") Tags label(for="tags") Tags
input(type="text", name="tags", id="tags", value=formkeep.tags) input.form-control(type="text", name="tags", id="tags", value=formkeep.tags)
input(type="submit", value="Submit") button.btn.btn-primary(type="submit") Submit
script. script.
CKEDITOR.replace('composer1') CKEDITOR.replace('composer1')
a(href="/news") Back to news directory

View File

@ -7,33 +7,49 @@ block title
|Icy Network - News |Icy Network - News
block body block body
.document .container.mt-4
.content nav(aria-label="breadcrumb")
if user && user.privilege && user.privilege > 0 ol.breadcrumb
a.button(style="float: right;" href="/news/compose") New Article li.breadcrumb-item
h1 Icy Network News Archive a(href="/") Home
if news.error li.breadcrumb-item.active(aria-current="page") News
span.error There are no articles to show.
else if user && user.privilege && user.privilege > 0
if news.page a.btn.btn-light.float-right(href="/news/compose") New Article
span.pagenum h1.pb-3.mb-4.border-bottom Icy Network News
|Page #{news.page.page} of #{news.page.pages} if news.error
.pgn span.error There are no articles to show.
else
if news.page
nav(aria-label="pagination")
ul.pagination
if news.page.page > 1 if news.page.page > 1
a.button(href="/news/?page=" + (news.page.page - 1)) Previous li.page-item
a.page-link(href="/news/?page=" + (news.page.page - 1)) Previous
else
li.page-item.disabled
a.page-link(href="#" tabindex="-1") Previous
- var n = 0 - var n = 0
while n < news.page.pages while n < news.page.pages
a.button(href="/news/?page=" + (n + 1))= n + 1 - var current = n + 1 == news.page.page
li.page-item(class=(current ? 'active' : ''))
a.page-link(href="/news/?page=" + (n + 1))= n + 1
if current
span.sr-only &nbsp;(current)
- n++ - n++
if news.page.pages > news.page.page if news.page.pages > news.page.page
a.button(href="/news/?page=" + (news.page.page + 1)) Next li.page-item
each val in news.articles a.page-link(href="/news/?page=" + (news.page.page + 1)) Next
.article else
a.title(href="/news/" + val.id + "-" + val.slug)= val.title li.page-item.disabled
.author Published by a.page-link(href="#" tabindex="-1") Next
span #{val.author.display_name} each val in news.articles
|at .news-article
.timestamp #{new Date(val.created_at)} h2.news-title
.content!= val.content a(href="/news/" + val.id + "-" + val.slug)= val.title
hr p.news-meta Published by
span #{val.author.display_name}
|at #{new Date(val.created_at)}
.content!= val.content
hr

View File

@ -3,13 +3,11 @@ block title
|Icy Network - Redirecting |Icy Network - Redirecting
block body block body
.wrapper .container
.boxcont h1 Redirecting
.box#totpcheck p Please wait..
h1 Redirecting script.
p Please wait.. window.close()
script. setTimeout(function () {
window.close() window.location.href = '#{url}'
setTimeout(function () { }, 1000)
window.location.href = '#{url}'
}, 1000)

View File

@ -3,26 +3,27 @@ block title
|Icy Network - Banned Account |Icy Network - Banned Account
block body block body
.wrapper .container.mt-4.mb-4
.boxcont if ipban
.box#login h1 This IP Address is banned from accessing Icy Network
if ipban else
h1 This IP Address is BANNED! h1 This user is banned from accessing Icy Network.
else p This user currently has #{bans.length} ban(s) active.
h1 This User is BANNED! each ban in bans
p This user currently has #{bans.length} ban(s) active .ban.alert.alert-danger
each ban in bans p
.message.error.ban b Banned at
label Banned .date #{new Date(ban.banned)}
.date #{new Date(ban.banned)} p
label Reason b Reason
.reason #{ban.reason} .reason #{ban.reason}
label Expires at p
.expiry b Expires at
if !ban.expiry .expiry
b This ban is permanent.
else
|#{new Date(ban.expiry)}
if !ban.expiry if !ban.expiry
b This ban cannot be appealed. b This ban is permanent.
else
|#{new Date(ban.expiry)}
if !ban.expiry
b This ban cannot be appealed.

View File

@ -3,27 +3,34 @@ block title
|Icy Network - Change User Email |Icy Network - Change User Email
block body block body
.wrapper .container.mt-4.mb-4
.boxcont nav(aria-label="breadcrumb")
.box#totpcheck ol.breadcrumb
h1 Change Your Email li.breadcrumb-item
if message.text a(href="/") Home
if message.error li.breadcrumb-item
.message.error a(href="/user/manage") User Settings
span #{message.text} li.breadcrumb-item.active(aria-current="page") Change Email Address
else h1 Change Your Email Address
.message if message.text
span #{message.text} if message.error
form#loginForm(method="POST", action="") .alert.alert-danger
input(type="hidden", name="csrf", value=csrf) span #{message.text}
if email else
label(for="email") Current Email Address .alert.alert-success
small Email Hint: #{email} span #{message.text}
br form#loginForm(method="POST", action="")
input(type="email", name="email", id="email") input(type="hidden", name="csrf", value=csrf)
label(for="email_new") New Email Address if email
input(type="email", name="email_new", id="email_new") .form-group
if password label(for="email") Current Email Address
label(for="password") Password input.form-control(type="email", name="email", id="email")
input(type="password", name="password", id="password") small Email Hint: #{email}
input(type="submit", value="Change") .form-group
label(for="email_new") New Email Address
input.form-control(type="email", name="email_new", id="email_new")
if password
.form-group
label(for="password") Password
input.form-control(type="password", name="password", id="password")
button.btn.btn-primary(type="submit") Done

View File

@ -3,27 +3,28 @@ block title
|Icy Network - Log In |Icy Network - Log In
block body block body
.wrapper .container.mb-4.mt-4
.boxcont h1 Log in
.box#login .row
h1 Log in .col-sm-8
.left if message.text
if message.text if message.error
if message.error .alert.alert-danger
.message.error span #{message.text}
span #{message.text} else
else .alert.alert-success
.message span #{message.text}
span #{message.text} form#loginForm(method="POST", action="")
form#loginForm(method="POST", action="") input(type="hidden", name="csrf", value=csrf)
input(type="hidden", name="csrf", value=csrf) .form-group
label(for="username") Username or Email Address label(for="username") Username or Email Address
input(type="text", name="username", id="username") input.form-control(type="text", name="username", id="username")
.form-group
label(for="password") Password label(for="password") Password
input(type="password", name="password", id="password") input.form-control(type="password", name="password", id="password")
input(type="submit", value="Log in") button.btn.btn-primary(type="submit") Log in
a#create(href="/register") Create an account a(href="/register") Create an account
span.divider &middot; | ·
a#create(href="/login/reset") Forgot password? a(href="/login/reset") Forgot password?
.right aside.col-sm-4
include ../includes/external.pug include ../includes/external.pug

View File

@ -1,29 +1,37 @@
.rel.cropbox .rel.cropbox
link(rel="stylesheet", type="text/css", href="https://cdnjs.cloudflare.com/ajax/libs/cropper/2.3.4/cropper.min.css") .row#fileChoose
script(src="https://cdnjs.cloudflare.com/ajax/libs/cropper/2.3.4/cropper.min.js") .col
.otherdata h3 Current Avatar
h3 Current Avatar .avatar
.avatar include ../../includes/avatar.pug
include ../../includes/avatar.pug .col
.inputting .alert.alert-danger#avatarAlert(style="display: none")
h3 Upload new form
.message.error .form-check
small Max filesize: 1 MB, only .png and .jpg allowed input.form-check-input#uploadType(type="radio", name="avi", checked)
br label(for="#uploadType") Upload Image
input(type="file", id="fileinput") .form-group.ml-5
.editor(style="display: none") label(for="#fileinput") Choose File
h3 Crop the image input.form-control-file#fileinput(type="file", aria-labelledby="#maxFileText")
img.preview(id="image") small#maxFileText Max file size: 5 MB, only .png and .jpg allowed
.buttons .form-check
.button#done Done .row
.button#cancel Cancel .col
.button#upload Upload Now input.form-check-input#gravType(type="radio", name="avi")
label(for="#gravType") Use
a(href="https://en.gravatar.com/", target="_blank") Gravatar
.col
img#gravatarPic
.content#crop(style="display: none;")
h3 Crop the Image
.alert.alert-info#cropAlert(style="display: none;") Uploading..
img.preview#imageCropTag
script. script.
window.jQuery = $ function failAlert (msg) {
function message (msg) { $('#avatarAlert').text(msg)
$('.message').text(msg) $('#avatarAlert').show()
$('.message').show()
} }
function dataURItoBlob (dataURI) { function dataURItoBlob (dataURI) {
@ -51,20 +59,21 @@ script.
} }
function cropReady() { function cropReady() {
let cropargs = $('#image').cropper('getData') let cropargs = $('#imageCropTag').cropper('getData')
let cropimage = $('#image').cropper('getCroppedCanvas') let cropimage = $('#imageCropTag').cropper('getCroppedCanvas')
$('#upload').show() $('#btnUpload').show()
$('#done').hide() $('#btnDone').hide()
$('.preview').attr('src', cropimage.toDataURL()) $('#imageCropTag').attr('src', cropimage.toDataURL())
$('.preview').show() $('#imageCropTag').show()
$('#image').cropper('destroy') $('#imageCropTag').cropper('destroy')
let called = false let called = false
$('#upload').click(function (e) { $('#btnUpload').click(function (e) {
if (called) return if (called) return
called = true called = true
$('#upload').hide() $('#btnUpload').hide()
$('#cropAlert').show()
let formData = new FormData() let formData = new FormData()
formData.append('image', dataURItoBlob(fr.result)) formData.append('image', dataURItoBlob(fr.result))
@ -79,14 +88,14 @@ script.
processData: false, processData: false,
contentType: false, contentType: false,
success: function (data) { success: function (data) {
window.Dialog.close() $('avatarModal').modal('hide')
window.location.reload() window.location.reload()
}, },
error: function (err) { error: function (err) {
if (err.responseJSON && err.responseJSON.error) { if (err.responseJSON && err.responseJSON.error) {
message(err.responseJSON.error) failAlert(err.responseJSON.error)
} }
$('#cancel').click() cancel()
} }
}) })
}) })
@ -96,20 +105,19 @@ script.
let match = blob.match(/data:image\/(\w+);/) let match = blob.match(/data:image\/(\w+);/)
let screenlen = $('.mobview').is(':visible') let screenlen = $('.mobview').is(':visible')
if (!match) { if (!match) {
return message('Not an image file!') return failAlert('Not an image file!')
} }
if (match[1] !== 'png' && match[1] !== 'jpg' && match[1] !== 'jpeg') { if (match[1] !== 'png' && match[1] !== 'jpg' && match[1] !== 'jpeg') {
return message('Unsupported image file') return failAlert('Unsupported image file')
} }
$('#image').attr('src', fr.result).hide() $('#imageCropTag').attr('src', fr.result).hide()
$('.inputting').hide() $('#fileChoose').hide()
$('.otherdata').hide() $('#btnUpload').hide()
$('#upload').hide() $('#btnDone').show()
$('#done').show() $('#crop').show()
$('.editor').show() $('#imageCropTag').cropper({
$('#image').cropper({
aspectRatio: 1 / 1, aspectRatio: 1 / 1,
minContainerHeight: screenlen ? 128 : 512, minContainerHeight: screenlen ? 128 : 512,
minContainerWidth: screenlen ? 128 : 512, minContainerWidth: screenlen ? 128 : 512,
@ -117,44 +125,86 @@ script.
}) })
} }
function gravatarDance() {
$.ajax({
type: 'GET',
url: '/api/avatar/gravatar',
success: function (ln) {
if ($('#userAvatarFile').length) {
var ufile = $('#userAvatarFile').attr('src')
if (ufile.indexOf('/GRAV-') !== -1) {
$('#gravType').prop('checked', true)
} else {
$('#uploadType').prop('checked', true)
}
}
$('#gravatarPic').attr('src', ln)
}
})
$('#gravType').click(function (e) {
$.ajax({
type: 'POST',
url: '/api/avatar/gravatar',
success: function () {
window.location.reload()
}
})
})
}
function cancel() {
$('#fileChoose').show()
$('#cropAlert').hide()
$('#btnDone').hide()
$('#btnUpload').hide()
$('#crop').hide()
$('#imageCropTag').cropper('destroy')
fr = null
}
function handleFileSelect() { function handleFileSelect() {
if (!window.File || !window.FileReader || !window.FileList || !window.Blob) { if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
return message('The File APIs are not fully supported in this browser.') return failAlert('The File APIs are not fully supported in this browser.')
} }
let input = document.getElementById('fileinput') let input = document.getElementById('fileinput')
if (!input.files) { if (!input.files) {
message('This browser doesn\'t seem to support the `files` property of file inputs.') return failAlert('This browser doesn\'t seem to support the `files` property of file inputs.')
} else if (!input.files[0]) {
message('Please select a file.')
} else if (input.files[0].size > 1000000) {
message('This file is too big. Max: 1 MB')
} else {
file = input.files[0]
fr = new FileReader()
fr.readAsDataURL(file)
fr.addEventListener('load', function (e) {
ready(fr.result)
})
return
} }
if (!input.files[0]) {
return failAlert('Please select a file.')
}
if (input.files[0].size > 5000000) {
return failAlert('This file is too big. Max: 5 MB')
}
file = input.files[0]
fr = new FileReader()
fr.readAsDataURL(file)
fr.addEventListener('load', function (e) {
ready(fr.result)
})
} }
$('#fileinput').on('change', function (e) { $(window).ready(function () {
e.preventDefault() $('#avatarModal').on('hidden.bs.modal', function (e) {
handleFileSelect() cancel()
})
$('#avatarModal').on('show.bs.modal', function (e) {
gravatarDance()
})
$('#fileinput').on('change', function (e) {
e.preventDefault()
handleFileSelect()
})
$('#btnDone').click(function (e) {
cropReady()
})
}) })
$('#cancel').click(function (e) {
$('.inputting').show()
$('.otherdata').show()
$('.editor').hide()
$('#image').cropper('destroy')
})
$('#done').click(function (e) {
cropReady()
})
$('.message').hide()

View File

@ -3,20 +3,19 @@ block title
|Icy Network - Password Required |Icy Network - Password Required
block body block body
.wrapper .container.mt-4.mb-4
.boxcont h1 Enter your password
.box#totpcheck p This action requires your password to continue
h1 Enter your password if message.text
small.descr This action requires your password to continue if message.error
if message.text .alert.alert-danger
if message.error span #{message.text}
.message.error else
span #{message.text} .alert.alert-warning
else span #{message.text}
.message form#loginForm(method="POST", action=post)
span #{message.text} input(type="hidden", name="csrf", value=csrf)
form#loginForm(method="POST", action=post) .form-group
input(type="hidden", name="csrf", value=csrf) label(for="password") Password
label(for="password") Password input.form-control#password(type="password", name="password")
input(type="password", name="password", id="password") button.btn.btn-primary(type="submit") Continue
input(type="submit", value="Continue")

View File

@ -3,25 +3,34 @@ block title
|Icy Network - Change User Password |Icy Network - Change User Password
block body block body
.wrapper .container.mt-4.mb-4
.boxcont if user
.box#totpcheck nav(aria-label="breadcrumb")
h1 Change Your Password ol.breadcrumb
if message.text li.breadcrumb-item
if message.error a(href="/") Home
.message.error li.breadcrumb-item
span #{message.text} a(href="/user/manage") User Settings
else li.breadcrumb-item.active(aria-current="page") Change Password
.message h1 Change Your Password
span #{message.text} if message.text
form#loginForm(method="POST", action="") if message.error
input(type="hidden", name="csrf", value=csrf) .alert.alert-danger
if !token span #{message.text}
label(for="password_old") Current Password else
input(type="password", name="password_old", id="password_old") .alert.alert-success
label(for="password") New Password span #{message.text}
input(type="password", name="password", id="password") form#loginForm(method="POST", action="")
label(for="password_repeat") Repeat New Password input(type="hidden", name="csrf", value=csrf)
input(type="password", name="password_repeat", id="password_repeat", autocomplete="off") if !token
div#repeatcheck(style="display: none") .form-group
input(type="submit", value="Change") label(for="password_old") Current Password
input.form-control#password_old(type="password", name="password_old")
.form-group
label(for="password") New Password
input.form-control#password(type="password", name="password")
.form-group
label(for="password_repeat") Repeat New Password
input.form-control#password_repeat(type="password", name="password_repeat", autocomplete="off")
small#repeatcheck(style="display: none")
button.btn.btn-primary(type="submit") Change

View File

@ -3,35 +3,41 @@ block title
|Icy Network - Register |Icy Network - Register
block body block body
.wrapper .container.mb-4.mt-4
.boxcont h1 Create a new account
.box#login if message.text
h1 Create a new account if message.error
.left .alert.alert-danger
if message.text span #{message.text}
if message.error else
.message.error .alert.alert-success
span #{message.text} span #{message.text}
else form#loginForm(method="POST", action="")
.message input(type="hidden", name="csrf", value=csrf)
span #{message.text} .form-group
form#loginForm(method="POST", action="") label(for="username") Username
input(type="hidden", name="csrf", value=csrf) input.form-control#username(type="text", name="username", value=formkeep.username, aria-labelledby="usernameText")
label(for="username") Username small#usernameText English characters, numbers and -_ only.
input(type="text", name="username", id="username", value=formkeep.username) .form-group
label(for="display_name") Display Name label(for="display_name") Display Name
input(type="text", name="display_name", id="display_name", value=formkeep.display_name) input.form-control#display_name(type="text", name="display_name", value=formkeep.display_name, aria-labelledby="display_nameText")
label(for="email") Email Address small#display_nameText The name displayed on your public profiles.
input(type="email", name="email", id="email", value=formkeep.email) .form-group
label(for="password") Password label(for="email") Email Address
input(type="password", name="password", id="password") input.form-control#email(type="email", name="email", value=formkeep.email)
label(for="password_repeat") Repeat Password .form-group
input(type="password", name="password_repeat", id="password_repeat", autocomplete="off") label(for="password") Password
div#repeatcheck(style="display: none") input.form-control#password(type="password", name="password", aria-labelledby="passwordText")
if recaptcha small#passwordText 8 characters minimum.
script(src='https://www.google.com/recaptcha/api.js') .form-group
.g-recaptcha(data-sitekey=recaptcha) label(for="password_repeat") Repeat Password
input(type="submit", value="Register") input.form-control#password_repeat(type="password", name="password_repeat", autocomplete="off")
a#create(href="/login") Log in with an existing account small#repeatcheck(style="display: none")
.right if recaptcha
include ../includes/external.pug .form-group
label Captcha
script(src='https://www.google.com/recaptcha/api.js')
.g-recaptcha(data-sitekey=recaptcha)
button.btn.btn-primary(type="submit") Register
| or
a(href="/login") log in with an existing account

View File

@ -3,21 +3,20 @@ block title
|Icy Network - Reset Password |Icy Network - Reset Password
block body block body
.wrapper .container.mt-4.mb-4
.boxcont h1 Reset your password
.box#totpcheck p Enter your email below in order to reset your password.
h1 Reset your password if message.text
p Enter your email below in order to reset your password. if message.error
if message.text .alert.alert-danger
if message.error span #{message.text}
.message.error else
span #{message.text} .alert.alert-info
else span #{message.text}
.message if !sent
span #{message.text} form#loginForm(method="POST", action=post)
if !sent input(type="hidden", name="csrf", value=csrf)
form#loginForm(method="POST", action=post) .form-group
input(type="hidden", name="csrf", value=csrf) label(for="email") Email Address
label(for="email") Email Address input.form-control#email(type="email", name="email")
input(type="email", name="email", id="email") button.btn.btn-primary(type="submit") Continue
input(type="submit", value="Continue")

View File

@ -2,71 +2,104 @@ extends ../layout.pug
block title block title
|Icy Network - User Settings |Icy Network - User Settings
block append links
link(rel="stylesheet", type="text/css", href="https://cdnjs.cloudflare.com/ajax/libs/cropper/2.3.4/cropper.min.css")
script(src="https://cdnjs.cloudflare.com/ajax/libs/cropper/2.3.4/cropper.min.js")
block body block body
.wrapper .container.mt-4.mb-4
.boxcont nav(aria-label="breadcrumb")
.box#settings ol.breadcrumb
h1 User Settings li.breadcrumb-item
.left a(href="/") Home
if message.text li.breadcrumb-item.active(aria-current="page") User Settings
if message.error h1 User Settings
.message.error .modal.fade#avatarModal(tabindex="-1", role="dialog", aria-labelledby="avatarModalTitle", aria-hidden="true")
span #{message.text} .modal-dialog.modal-lg(role="document")
else .modal-content
.message .modal-header
span #{message.text} h5.modal-title#avatarModalTitle Change Avatar
form#loginForm(method="POST", action="") button.close(type="button", data-dismiss="modal", aria-label="Close")
input(type="hidden", name="csrf", value=csrf) span(aria-hidden="true") &times;
label(for="username") Username .modal-body
input(type="text", name="username", id="username", value=user.username, disabled) include partials/avatar.pug
label(for="display_name") Display Name .modal-footer
input(type="text", name="display_name", id="display_name", value=user.display_name) button.btn.btn-secondary(type="button", data-dismiss="modal") Close
label Avatar button.btn.btn-primary#btnDone(type="button", style="display: none;") Done
.avatarCont button.btn.btn-primary#btnUpload(type="button", style="display: none;") Upload
include ../includes/avatar.pug .row
.options .col-3
a#newAvatar(href='#') Change Avatar .nav.flex-column.nav-pills#v-pills-tab(role="tablist", aria-orientation="vertical")
if user.avatar_file a.nav-link.active#v-pills-main-tab(data-toggle="tab", href="#v-pills-main", role="tab", aria-control="v-pills-main", aria-selected="true") General Settings
a#removeAvatar(href='#') Remove Avatar a.nav-link#v-pills-social-tab(data-toggle="tab", href="#v-pills-social", role="tab", aria-control="v-pills-social", aria-selected="false") Social Accounts
input(type="submit", value="Save Settings") a.nav-link#v-pills-oauth2-tab(data-toggle="tab", href="#v-pills-oauth2", role="tab", aria-control="v-pills-oauth2", aria-selected="false") Authorizations
.right a.nav-link#v-pills-actions-tab(data-toggle="tab", href="#v-pills-actions", role="tab", aria-control="v-pills-actions", aria-selected="false") Account Actions
h3 Social Media Accounts .col-9
.specify(title="You can add social media accounts to your account for ease of login. Once added, logging in from linked sources logs you into this account automatically.") ? .tab-content#v-pills-tabContent
include ../includes/external.pug .tab-pane.fade.show.active#v-pills-main(role="tabpanel", aria-labelledby="v-pills-main")
if google_auth == false h2 General Settings
a.option.accdisconnect(href="/api/external/google/remove") if message.text
i.fa.fa-fw.fa-times if message.error
|Unlink Google .alert.alert-danger
if twitter_auth == false span #{message.text}
a.option.accdisconnect(href="/api/external/twitter/remove") else
i.fa.fa-fw.fa-times .alert.alert-success
|Unlink Twitter span #{message.text}
if facebook_auth == false form#loginForm(method="POST", action="")
a.option.accdisconnect(href="/api/external/facebook/remove") input(type="hidden", name="csrf", value=csrf)
i.fa.fa-fw.fa-times .form-group
|Unlink Facebook label(for="username") Username
if discord_auth == false input.form-control(type="text", name="username", id="username", value=user.username, disabled)
a.option.accdisconnect(href="/api/external/discord/remove") .form-group
i.fa.fa-fw.fa-times label(for="display_name") Display Name
|Unlink Discord input.form-control(type="text", name="display_name", id="display_name", value=user.display_name)
h3 Other Options label Avatar
if password .avatarCont
a.option(href="/user/manage/password") include ../includes/avatar.pug
i.fa.fa-fw.fa-lock .options
|Change Password a(data-toggle="modal", data-target="#avatarModal" href='#') Change Avatar
if totp if user.avatar_file
a.option(href="/user/two-factor/disable") a#removeAvatar(href='#') Remove Avatar
button.btn.btn-primary(type="submit") Save Settings
.tab-pane.fade#v-pills-social(role="tabpanel", aria-labelledby="v-pills-social")
h3 Social Media Accounts
p You can add social media accounts to your account for ease of login. Once added, logging in from linked sources logs you into this account automatically.
include ../includes/external.pug
if google_auth == false
a.option.disconnect.login-btn.float-lg-right(href="/api/external/google/remove")
i.fa.fa-fw.fa-times
|Unlink Google
if twitter_auth == false
a.option.disconnect.login-btn.float-lg-right(href="/api/external/twitter/remove")
i.fa.fa-fw.fa-times
|Unlink Twitter
if facebook_auth == false
a.option.disconnect.login-btn.float-lg-right(href="/api/external/facebook/remove")
i.fa.fa-fw.fa-times
|Unlink Facebook
if discord_auth == false
a.option.disconnect.login-btn.float-lg-right(href="/api/external/discord/remove")
i.fa.fa-fw.fa-times
|Unlink Discord
.tab-pane.fade#v-pills-oauth2(role="tabpanel", aria-labelledby="v-pills-oauth2")
h2 Authorized Applications
p Applications which have access to basic user information. You may restrict access at any time by pressing the red icon on the top right of the application card.
.cl#clientlist
p Please enable JavaScript to view this content.
.tab-pane.fade#v-pills-actions(role="tabpanel", aria-labelledby="v-pills-actions")
h3 Account Actions
if password
a.option(href="/user/manage/password")
i.fa.fa-fw.fa-lock i.fa.fa-fw.fa-lock
|Disable Two-Factor Authentication |Change Password
else if totp
a.option(href="/user/two-factor") a.option(href="/user/two-factor/disable")
i.fa.fa-fw.fa-lock i.fa.fa-fw.fa-lock
|Enable Two-Factor Authentication |Disable Two-Factor Authentication
a.option(href="/user/manage/email") else
i.fa.fa-fw.fa-envelope a.option(href="/user/two-factor")
|Change Email Address i.fa.fa-fw.fa-lock
.clients |Enable Two-Factor Authentication
h2 Authorized Applications a.option(href="/user/manage/email")
.specify(title="Applications which have access to basic user information. You may restrict access at any time by pressing the red icon on the top right of the application card.") ? i.fa.fa-fw.fa-envelope
.cl#clientlist |Change Email Address
p Please enable JavaScript to view this content.

View File

@ -3,20 +3,19 @@ block title
|Icy Network - Log In - Verification Required |Icy Network - Log In - Verification Required
block body block body
.wrapper .container.mt-4.mb-4
.boxcont h1 Enter Code
.box#totpcheck p This user has Two Factor Authentication enabled. Enter the code to log in.
h1 Enter Code if message.text
small.descr This user has Two Factor Authentication enabled. Enter the code to log in. if message.error
if message.text .alert.alert-danger
if message.error span #{message.text}
.message.error else
span #{message.text} .alert.alert-success
else span #{message.text}
.message form#loginForm(method="POST", action="")
span #{message.text} input(type="hidden", name="csrf", value=csrf)
form#loginForm(method="POST", action="") .form-group
input(type="hidden", name="csrf", value=csrf) label(for="code") Code
label(for="code") Code input.form-control#code(type="text", name="code", autocomplete="off")
input(type="text", name="code", id="code", autocomplete="off") button.btn.btn-primary(type="submit") Log in
input(type="submit", value="Log in")

View File

@ -3,33 +3,40 @@ block title
|Icy Network - Activate Authenticator |Icy Network - Activate Authenticator
block body block body
.wrapper .container.mt-4.mb-4
.boxcont nav(aria-label="breadcrumb")
.box#login ol.breadcrumb
h1 Two Factor Authentication li.breadcrumb-item
.left a(href="/") Home
if message.text li.breadcrumb-item
if message.error a(href="/user/manage") User Settings
.message.error li.breadcrumb-item.active(aria-current="page") Enable Two Factor Authentication
span #{message.text} h1 Two Factor Authentication
else .row
.message .col
span #{message.text} if message.text
img.qr(src="//api.qrserver.com/v1/create-qr-code/?data=" + uri) if message.error
form#totpForm(method="POST", action="") .alert.alert-danger
input(type="hidden", name="csrf", value=csrf) span #{message.text}
else
.alert.alert-warning
span #{message.text}
img.qr(src="//api.qrserver.com/v1/create-qr-code/?data=" + uri)
form#totpForm(method="POST", action="")
input(type="hidden", name="csrf", value=csrf)
.form-group
label(for="code") Enter the Code label(for="code") Enter the Code
input(type="text", name="code", id="code", autocomplete="off") input.form-control#code(type="text", name="code", autocomplete="off")
input(type="submit", value="Enable Now") button.btn.btn-primary(type="submit") Enable Now
.right aside.col
h3 How to use h3 How to use
ol ol
li Scan the QR Code with your authenticator app li Scan the QR Code with your authenticator app
li Enter the one-time code given to you li Enter the one-time code given to you
li You will now be asked for a code every time you log in li You will now be asked for a code every time you log in
h3 Authenticator app h3 Authenticator app
p We recommend using Google Authenticator p We recommend using Google Authenticator. You can download it below for your smartphone:
a.dlbtn(href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1', target="_blank") a.app-button(href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1', target="_blank")
img(alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png') img(alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png')
a.dlbtn.apple(href='https://itunes.apple.com/us/app/google-authenticator/id388497605', target="_blank") a.app-button.apple(href='https://itunes.apple.com/us/app/google-authenticator/id388497605', target="_blank")
img(alt='Download on the App Store' src='https://devimages-cdn.apple.com/app-store/marketing/guidelines/images/badge-download-on-the-app-store.svg') img(alt='Download on the App Store' src='https://devimages-cdn.apple.com/app-store/marketing/guidelines/images/badge-download-on-the-app-store.svg')