From 16b973d07a7550f4b344d3d6fff4edfd43c3992b Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 29 Aug 2019 18:53:59 -0500 Subject: [PATCH] initial commit --- .gitignore | 1 + codebox/.gitignore | 4 + codebox/Tupfile | 1 + codebox/Tuprules.tup | 1 + codebox/app.moon | 3 + codebox/app/Tupfile | 1 + codebox/app/app.moon | 34 ++++++ codebox/config.moon | 15 +++ codebox/controllers/Tupfile | 1 + codebox/controllers/account/Tupfile | 1 + codebox/controllers/account/login.moon | 33 ++++++ codebox/controllers/account/logout.moon | 7 ++ codebox/controllers/account/register.moon | 48 ++++++++ codebox/controllers/controller.moon | 20 ++++ codebox/controllers/executer/Tupfile | 1 + codebox/controllers/executer/request.moon | 25 +++++ .../controllers/executer/status_update.moon | 8 ++ codebox/controllers/index.moon | 11 ++ codebox/facades/Tupfile | 1 + codebox/facades/executer.moon | 13 +++ codebox/flows/Tupfile | 1 + codebox/flows/csrf_setup.moon | 5 + codebox/flows/csrf_validate.moon | 5 + codebox/middleware/Tupfile | 1 + codebox/middleware/internal_request.moon | 8 ++ codebox/middleware/logged_in.moon | 12 ++ codebox/middleware/logged_out.moon | 6 + codebox/migrations.moon | 38 +++++++ codebox/mime.types | 81 ++++++++++++++ codebox/models.moon | 2 + codebox/models/Tupfile | 1 + codebox/models/jobs.moon | 7 ++ codebox/models/problems.moon | 12 ++ codebox/models/users.moon | 10 ++ codebox/nginx.conf | 62 +++++++++++ codebox/services/Tupfile | 1 + codebox/services/crypto.moon | 14 +++ codebox/static/Tupfile | 2 + codebox/static/coffee/main.coffee | 2 + codebox/static/css/core.css | 105 ++++++++++++++++++ codebox/static/css/core.css.map | 1 + codebox/static/imgs/grain_background.png | Bin 0 -> 1697 bytes codebox/static/imgs/logo.png | Bin 0 -> 117117 bytes codebox/static/js/main.js | 11 ++ codebox/static/js/main.js.map | 13 +++ codebox/static/scss/_elevate.scss | 3 + codebox/static/scss/_navbar.scss | 52 +++++++++ codebox/static/scss/_utils.scss | 21 ++++ codebox/static/scss/_vars.scss | 21 ++++ codebox/static/scss/core.scss | 24 ++++ codebox/static/scss/problem/_list.scss | 0 codebox/static/scss/problem/_sidebar.scss | 55 +++++++++ codebox/utils/Tupfile | 1 + codebox/utils/binding.moon | 23 ++++ codebox/views/Tupfile | 1 + codebox/views/account/Tupfile | 1 + codebox/views/account/login.moon | 11 ++ codebox/views/account/register.moon | 18 +++ codebox/views/index.moon | 19 ++++ codebox/views/partials/Tupfile | 1 + codebox/views/partials/layout.moon | 14 +++ codebox/views/partials/navbar.moon | 12 ++ config.env.example | 6 + docker-compose.yaml | 71 ++++++++++++ docker/codebox/Dockerfile | 29 +++++ docker/executer/Dockerfile | 16 +++ executer/.gitignore | 4 + executer/Tupfile | 1 + executer/Tuprules.tup | 1 + executer/app/Tupfile | 1 + executer/app/routes.coffee | 22 ++++ executer/main.coffee | 15 +++ executer/package.json | 14 +++ 73 files changed, 1086 insertions(+) create mode 100644 .gitignore create mode 100644 codebox/.gitignore create mode 100644 codebox/Tupfile create mode 100644 codebox/Tuprules.tup create mode 100644 codebox/app.moon create mode 100644 codebox/app/Tupfile create mode 100644 codebox/app/app.moon create mode 100644 codebox/config.moon create mode 100644 codebox/controllers/Tupfile create mode 100644 codebox/controllers/account/Tupfile create mode 100644 codebox/controllers/account/login.moon create mode 100644 codebox/controllers/account/logout.moon create mode 100644 codebox/controllers/account/register.moon create mode 100644 codebox/controllers/controller.moon create mode 100644 codebox/controllers/executer/Tupfile create mode 100644 codebox/controllers/executer/request.moon create mode 100644 codebox/controllers/executer/status_update.moon create mode 100644 codebox/controllers/index.moon create mode 100644 codebox/facades/Tupfile create mode 100644 codebox/facades/executer.moon create mode 100644 codebox/flows/Tupfile create mode 100644 codebox/flows/csrf_setup.moon create mode 100644 codebox/flows/csrf_validate.moon create mode 100644 codebox/middleware/Tupfile create mode 100644 codebox/middleware/internal_request.moon create mode 100644 codebox/middleware/logged_in.moon create mode 100644 codebox/middleware/logged_out.moon create mode 100644 codebox/migrations.moon create mode 100644 codebox/mime.types create mode 100644 codebox/models.moon create mode 100644 codebox/models/Tupfile create mode 100644 codebox/models/jobs.moon create mode 100644 codebox/models/problems.moon create mode 100644 codebox/models/users.moon create mode 100644 codebox/nginx.conf create mode 100644 codebox/services/Tupfile create mode 100644 codebox/services/crypto.moon create mode 100644 codebox/static/Tupfile create mode 100644 codebox/static/coffee/main.coffee create mode 100644 codebox/static/css/core.css create mode 100644 codebox/static/css/core.css.map create mode 100644 codebox/static/imgs/grain_background.png create mode 100644 codebox/static/imgs/logo.png create mode 100644 codebox/static/js/main.js create mode 100644 codebox/static/js/main.js.map create mode 100644 codebox/static/scss/_elevate.scss create mode 100644 codebox/static/scss/_navbar.scss create mode 100644 codebox/static/scss/_utils.scss create mode 100644 codebox/static/scss/_vars.scss create mode 100644 codebox/static/scss/core.scss create mode 100644 codebox/static/scss/problem/_list.scss create mode 100644 codebox/static/scss/problem/_sidebar.scss create mode 100644 codebox/utils/Tupfile create mode 100644 codebox/utils/binding.moon create mode 100644 codebox/views/Tupfile create mode 100644 codebox/views/account/Tupfile create mode 100644 codebox/views/account/login.moon create mode 100644 codebox/views/account/register.moon create mode 100644 codebox/views/index.moon create mode 100644 codebox/views/partials/Tupfile create mode 100644 codebox/views/partials/layout.moon create mode 100644 codebox/views/partials/navbar.moon create mode 100644 config.env.example create mode 100644 docker-compose.yaml create mode 100644 docker/codebox/Dockerfile create mode 100644 docker/executer/Dockerfile create mode 100644 executer/.gitignore create mode 100644 executer/Tupfile create mode 100644 executer/Tuprules.tup create mode 100644 executer/app/Tupfile create mode 100644 executer/app/routes.coffee create mode 100644 executer/main.coffee create mode 100644 executer/package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2549b3d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +config.env diff --git a/codebox/.gitignore b/codebox/.gitignore new file mode 100644 index 0000000..536871b --- /dev/null +++ b/codebox/.gitignore @@ -0,0 +1,4 @@ +logs/ +nginx.conf.compiled +*.lua +.tup diff --git a/codebox/Tupfile b/codebox/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/Tuprules.tup b/codebox/Tuprules.tup new file mode 100644 index 0000000..5fa92eb --- /dev/null +++ b/codebox/Tuprules.tup @@ -0,0 +1 @@ +: foreach *.moon |> moonc %f |> %B.lua diff --git a/codebox/app.moon b/codebox/app.moon new file mode 100644 index 0000000..f3e5c87 --- /dev/null +++ b/codebox/app.moon @@ -0,0 +1,3 @@ +-- Doing this allows for the app/ folder to be mounted +-- via a docker container for faster reloading +require "app.app" diff --git a/codebox/app/Tupfile b/codebox/app/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/app/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/app/app.moon b/codebox/app/app.moon new file mode 100644 index 0000000..25200f7 --- /dev/null +++ b/codebox/app/app.moon @@ -0,0 +1,34 @@ +lapis = require "lapis" +console = require "lapis.console" + +import Users from require "models" +bind = require "utils.binding" + +bind\bind 'test', -> 'Test called!!!' + +bind\bind_static 'executer', require 'facades.executer' +bind\bind_static 'crypto', -> require 'services.crypto' + +class extends lapis.Application + layout: require "views.partials.layout" + + views_prefix: 'views' + flows_prefix: 'flows' + middleware_prefix: 'middleware' + + @before_filter => + @navbar = {} + @navbar.selected = 1 + + ['index': "/"]: require "controllers.index" + ['account.login': "/login"]: require "controllers.account.login" + ['account.logout': "/logout"]: require "controllers.account.logout" + ['account.register': "/register"]: require "controllers.account.register" + + ['executer.status_update': "/executer/status_update"]: require "controllers.executer.status_update" + ['executer.request': '/executer/request']: require "controllers.executer.request" + + [test: "/test"]: => + "Your value is over 10" + + "/console": console.make! diff --git a/codebox/config.moon b/codebox/config.moon new file mode 100644 index 0000000..f6819e2 --- /dev/null +++ b/codebox/config.moon @@ -0,0 +1,15 @@ +config = require "lapis.config" + +config "development", -> + port 8888 + + secret (os.getenv 'APP_SECRET') + req_secret (os.getenv 'REQ_SECRET') + + postgres -> + -- Have to use a fixed ip since the container name + -- was not resolving correctly + host "192.168.0.2" + database (os.getenv 'POSTGRES_DB') + user (os.getenv 'POSTGRES_USER') + password (os.getenv 'POSTGRES_PASSWORD') diff --git a/codebox/controllers/Tupfile b/codebox/controllers/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/controllers/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/controllers/account/Tupfile b/codebox/controllers/account/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/controllers/account/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/controllers/account/login.moon b/codebox/controllers/account/login.moon new file mode 100644 index 0000000..c6caa48 --- /dev/null +++ b/codebox/controllers/account/login.moon @@ -0,0 +1,33 @@ +import make_controller from require "controllers.controller" +import Users from require 'models' +import assert_valid from require "lapis.validate" + +utils = require "lapis.util" + +make_controller + inject: + crypto: 'crypto' + + middleware: { 'logged_out' } + + get: => + @flow 'csrf_setup' + render: 'account.login' + + post: => + @flow 'csrf_validate' + + assert_valid @params, { + { "username", exists: true, min_length: 2 } + { "password", exists: true, min_length: 2 } + } + + users = Users\select "where username = ? limit 1", @params.username + if #users > 0 + if @crypto.verify @params.password, users[1].password_hash + @session.user_id = users[1].id + return redirect_to: @url_for 'index' + + render: 'account.login' + + diff --git a/codebox/controllers/account/logout.moon b/codebox/controllers/account/logout.moon new file mode 100644 index 0000000..23bd44f --- /dev/null +++ b/codebox/controllers/account/logout.moon @@ -0,0 +1,7 @@ +import make_controller from require "controllers.controller" + +make_controller { + get: => + @session.user_id = nil + return redirect_to: @url_for 'index' +} diff --git a/codebox/controllers/account/register.moon b/codebox/controllers/account/register.moon new file mode 100644 index 0000000..9bb399b --- /dev/null +++ b/codebox/controllers/account/register.moon @@ -0,0 +1,48 @@ +import make_controller from require "controllers.controller" +import Users from require 'models' +import assert_valid from require "lapis.validate" +import capture_errors from require 'lapis.application' + +make_controller + inject: + crypto: 'crypto' + + middleware: { 'logged_out' } + + get: => + @flow 'csrf_validate' + render: 'account.register' + + post: capture_errors => + @flow 'csrf_validate' + + assert_valid @params, { + { "username", exists: true, min_length: 2 } + { "nickname", exists: true, min_length: 2 } + { "email", exists: true, min_length: 4, matches_pattern: "%S+@%S+%.%S+" } + { "password", exists: true, min_length: 2 } + { "password_confirmation", exists: true, min_length: 2, equals: @params.password, 'Passwords must be the same' } + } + + users = Users\find username: @params.username + if users + -- Account already exists + @errors or= {} + table.insert @errors, 'Username already taken' + return render: 'account.register' + + user_id = Users\create { + username: @params.username + email: @params.email + nickname: @params.nickname + password_hash: @crypto.encrypt @params.password + } + + unless user_id + @errors or= {} + table.insert @errors, 'Error creating account' + return render: 'account.register' + + @session.user_id = user_id + redirect_to: @url_for 'index' + diff --git a/codebox/controllers/controller.moon b/codebox/controllers/controller.moon new file mode 100644 index 0000000..a9519e1 --- /dev/null +++ b/codebox/controllers/controller.moon @@ -0,0 +1,20 @@ +import respond_to from require "lapis.application" +bind = require 'utils.binding' + +{ + make_controller: (routes) -> + respond_to { + before: => + if routes.inject + for inj, dep in pairs routes.inject + @[inj] = bind\make dep + + return if not routes.middleware + + for middleware in *routes.middleware + require("#{@app.middleware_prefix}.#{middleware}") @ + + GET: => routes.get(@) + POST: => routes.post(@) + } +} diff --git a/codebox/controllers/executer/Tupfile b/codebox/controllers/executer/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/controllers/executer/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/controllers/executer/request.moon b/codebox/controllers/executer/request.moon new file mode 100644 index 0000000..aad1c7a --- /dev/null +++ b/codebox/controllers/executer/request.moon @@ -0,0 +1,25 @@ +import make_controller from require "controllers.controller" +import assert_valid from require "lapis.validate" +import capture_errors from require 'lapis.application' + +make_controller + inject: + executer: 'executer' + + middleware: { 'internal_request' } + + post: capture_errors (=> + assert_valid @params, { + { 'lang', exists: true } + { 'code', exists: true } + { 'problem_id', exists: true, is_integer: true } + } + + id = @executer\request @params.lang, @params.code + + json: id + ), => + json: { status: 'error occured', errors: @errors } + + + diff --git a/codebox/controllers/executer/status_update.moon b/codebox/controllers/executer/status_update.moon new file mode 100644 index 0000000..3a934ff --- /dev/null +++ b/codebox/controllers/executer/status_update.moon @@ -0,0 +1,8 @@ +import make_controller from require "controllers.controller" + +make_controller + middleware: { 'internal_request' } + + post: => + print 'Hit status' + json: { status: 'success' } diff --git a/codebox/controllers/index.moon b/codebox/controllers/index.moon new file mode 100644 index 0000000..a788ddb --- /dev/null +++ b/codebox/controllers/index.moon @@ -0,0 +1,11 @@ +import make_controller from require "controllers.controller" + +import Users, Jobs from require 'models' + +make_controller + middleware: { 'logged_in' } + + get: => + @users = Users\select! + @jobs = @user\get_c_jobs! + render: "index" diff --git a/codebox/facades/Tupfile b/codebox/facades/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/facades/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/facades/executer.moon b/codebox/facades/executer.moon new file mode 100644 index 0000000..f14ec60 --- /dev/null +++ b/codebox/facades/executer.moon @@ -0,0 +1,13 @@ +http = require 'lapis.nginx.http' +import from_json, to_json from require 'lapis.util' + +class ExecuterFacade + request: (lang, code) => + body = http.simple 'http://192.168.0.4:8080/submit', { + lang: lang + code: code + } + + from_json(body).id + + diff --git a/codebox/flows/Tupfile b/codebox/flows/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/flows/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/flows/csrf_setup.moon b/codebox/flows/csrf_setup.moon new file mode 100644 index 0000000..a360fe3 --- /dev/null +++ b/codebox/flows/csrf_setup.moon @@ -0,0 +1,5 @@ +csrf = require "lapis.csrf" + +=> + @csrf_token = csrf.generate_token @ + return diff --git a/codebox/flows/csrf_validate.moon b/codebox/flows/csrf_validate.moon new file mode 100644 index 0000000..54ca956 --- /dev/null +++ b/codebox/flows/csrf_validate.moon @@ -0,0 +1,5 @@ +csrf = require "lapis.csrf" + +=> + csrf.assert_token @ + @csrf_token = csrf.generate_token @ diff --git a/codebox/middleware/Tupfile b/codebox/middleware/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/middleware/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/middleware/internal_request.moon b/codebox/middleware/internal_request.moon new file mode 100644 index 0000000..edca0af --- /dev/null +++ b/codebox/middleware/internal_request.moon @@ -0,0 +1,8 @@ +config = (require 'lapis.config').get! + +=> + if @params.request_token != config.req_secret + @write { + status: 401 + json: { status: 'Unauthorized' } + } diff --git a/codebox/middleware/logged_in.moon b/codebox/middleware/logged_in.moon new file mode 100644 index 0000000..55b17ad --- /dev/null +++ b/codebox/middleware/logged_in.moon @@ -0,0 +1,12 @@ +import Users from require 'models' + +=> + if not @session.user_id + @write redirect_to: @url_for 'account.login' + return + + @user = Users\find(@session.user_id) + if not @user + @session.user_id = nil + @write redirect_to: @url_for 'account.login' + return diff --git a/codebox/middleware/logged_out.moon b/codebox/middleware/logged_out.moon new file mode 100644 index 0000000..4d80975 --- /dev/null +++ b/codebox/middleware/logged_out.moon @@ -0,0 +1,6 @@ +import Users from require 'models' + +=> + if @session.user_id + @user = Users\find(@session.user_id) + @write redirect_to: @url_for 'index' if @user diff --git a/codebox/migrations.moon b/codebox/migrations.moon new file mode 100644 index 0000000..74e2f8d --- /dev/null +++ b/codebox/migrations.moon @@ -0,0 +1,38 @@ +import create_table, types from require "lapis.db.schema" + +{ + [1]: => + create_table "users", { + { "id", types.serial }, + { "username", types.varchar }, + { "password_hash", types.varchar }, + { "nickname", types.varchar }, + { "email", types.varchar }, + + "PRIMARY KEY (id)" + } + + [2]: => + create_table "jobs", { + { "id", types.serial }, + { "user_id", types.foreign_key }, + { "problem_id", types.foreign_key }, + { "status", types.text null: true }, + { "lang", types.varchar }, + { "code", types.text null: true }, + { "time_initiated", types.time }, + + "PRIMARY KEY (id)" + } + + [3]: => + create_table "problems", { + { "id", types.serial }, + { "name", types.varchar }, + { "kind", types.enum }, + { "description", types.text null: true }, + { "time_limit", types.integer }, + + "PRIMARY KEY (id)" + } +} diff --git a/codebox/mime.types b/codebox/mime.types new file mode 100644 index 0000000..292f886 --- /dev/null +++ b/codebox/mime.types @@ -0,0 +1,81 @@ +types { + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + application/x-lua lua; + application/x-moonscript moon; + application/x-javascript js; + application/atom+xml atom; + application/rss+xml rss; + + text/mathml mml; + text/plain txt; + text/vnd.sun.j2me.app-descriptor jad; + text/vnd.wap.wml wml; + text/x-component htc; + + image/png png; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; + image/svg+xml svg svgz; + image/webp webp; + + application/java-archive jar war ear; + application/mac-binhex40 hqx; + application/msword doc; + application/pdf pdf; + application/postscript ps eps ai; + application/rtf rtf; + application/vnd.ms-excel xls; + application/vnd.ms-powerpoint ppt; + application/vnd.wap.wmlc wmlc; + application/vnd.google-earth.kml+xml kml; + application/vnd.google-earth.kmz kmz; + application/x-7z-compressed 7z; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/xhtml+xml xhtml; + application/zip zip; + + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; + application/octet-stream eot; + application/octet-stream iso img; + application/octet-stream msi msp msm; + + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; +} diff --git a/codebox/models.moon b/codebox/models.moon new file mode 100644 index 0000000..70be8f2 --- /dev/null +++ b/codebox/models.moon @@ -0,0 +1,2 @@ +import autoload from require "lapis.util" +autoload "models" diff --git a/codebox/models/Tupfile b/codebox/models/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/models/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/models/jobs.moon b/codebox/models/jobs.moon new file mode 100644 index 0000000..45be721 --- /dev/null +++ b/codebox/models/jobs.moon @@ -0,0 +1,7 @@ +import Model from require "lapis.db.model" + +class Jobs extends Model + @relations: { + { 'user', belongs_to: 'Users' } + { 'problem', belongs_to: 'Problems' } + } diff --git a/codebox/models/problems.moon b/codebox/models/problems.moon new file mode 100644 index 0000000..577e475 --- /dev/null +++ b/codebox/models/problems.moon @@ -0,0 +1,12 @@ +import Model, enum from require "lapis.db.model" + +class Problems extends Model + @kinds: enum { + code: 1 + golf: 2 + word: 3 + } + + @relations: { + { "jobs", has_many: 'Jobs' } + } diff --git a/codebox/models/users.moon b/codebox/models/users.moon new file mode 100644 index 0000000..d8b29e9 --- /dev/null +++ b/codebox/models/users.moon @@ -0,0 +1,10 @@ +import Model from require "lapis.db.model" + +class Users extends Model + @relations: { + { 'jobs', has_many: 'Jobs' } + { 'c_jobs' + has_many: 'Jobs' + where: { lang: 'C' } + } + } diff --git a/codebox/nginx.conf b/codebox/nginx.conf new file mode 100644 index 0000000..c90f83e --- /dev/null +++ b/codebox/nginx.conf @@ -0,0 +1,62 @@ +worker_processes ${{NUM_WORKERS}}; +error_log stderr notice; +daemon off; +pid logs/nginx.pid; + +events { + worker_connections 1024; +} + +env APP_SECRET; +env REQ_SECRET; +env POSTGRES_DB; +env POSTGRES_USER; +env POSTGRES_PASSWORD; + +http { + include mime.types; + + server { + listen ${{PORT}}; + lua_code_cache ${{CODE_CACHE}}; + + location / { + set $_url "http://192.168.0.4:8080"; + + default_type text/html; + content_by_lua ' + require("lapis").serve("app") + '; + } + + location /static/ { + alias static/; + } + + location /favicon.ico { + alias static/favicon.ico; + } + location /proxy { + internal; + rewrite_by_lua " + local req = ngx.req + + for k,v in pairs(req.get_headers()) do + if k ~= 'content-length' then + req.clear_header(k) + end + end + + if ngx.ctx.headers then + for k,v in pairs(ngx.ctx.headers) do + req.set_header(k, v) + end + end + "; + + resolver 8.8.8.8; + proxy_http_version 1.1; + proxy_pass $_url; + } + } +} diff --git a/codebox/services/Tupfile b/codebox/services/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/services/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/services/crypto.moon b/codebox/services/crypto.moon new file mode 100644 index 0000000..1ebedaa --- /dev/null +++ b/codebox/services/crypto.moon @@ -0,0 +1,14 @@ +bcrypt = require "bcrypt" + +import Users from require "models" + +ROUNDS = 10 + +{ + encrypt: (data) -> + bcrypt.digest(data, ROUNDS) + + verify: (data, digest) -> + bcrypt.verify(data, digest) +} + diff --git a/codebox/static/Tupfile b/codebox/static/Tupfile new file mode 100644 index 0000000..a7ec031 --- /dev/null +++ b/codebox/static/Tupfile @@ -0,0 +1,2 @@ +: scss/core.scss |> sass %f:css/%B.css |> css/%B.css css/%B.css.map +: coffee/*.coffee |> coffee -c -m -o js/%B.js %f |> js/%B.js js/%B.js.map diff --git a/codebox/static/coffee/main.coffee b/codebox/static/coffee/main.coffee new file mode 100644 index 0000000..478d195 --- /dev/null +++ b/codebox/static/coffee/main.coffee @@ -0,0 +1,2 @@ +main = -> + console.log "Hello world!" diff --git a/codebox/static/css/core.css b/codebox/static/css/core.css new file mode 100644 index 0000000..5b2439b --- /dev/null +++ b/codebox/static/css/core.css @@ -0,0 +1,105 @@ +.navbar { + z-index: 10000; + width: 100%; + background: #0077c2; + height: 47px; + position: relative; + box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.7); + display: grid; + grid-template-columns: 1fr 6fr 1fr; +} +.navbar .navbar-logo { + padding-left: 8px; + text-align: center; +} +.navbar .navbar-logo img { + max-height: calc(47px - 2px); + display: inline; +} +.navbar ul { + display: block; + text-align: center; + font-size: 0; +} +.navbar ul a li { + margin: 0; + display: inline-block; + cursor: pointer; + font-size: 24px; + list-style: none; + line-height: 40px; + padding-left: 30px; + padding-right: 30px; + padding-top: 4px; + color: #f2f2f2; + border-top-color: #0077c2; + transition: 200ms all; +} +.navbar ul a li.selected, .navbar ul a li:hover { + border-bottom: 2px solid #ffe766; + color: white; +} + +.sidebar-problem-list { + z-index: 50; + box-shadow: 0 10px 0 0 transparent, 0 10px 0 0 transparent, 10px 0 0 0 transparent, 0 8px 8px 2px rgba(0, 0, 0, 0.5); + background: #003252; + position: relative; + min-height: calc(100vh - 47px); +} +.sidebar-problem-list .sidebar-problem { + width: 100%; + display: grid; + grid-template-columns: 32px 1fr; + border-left-width: 24px; + border-left-style: solid; + transition: background-color 200ms east-in-out; + transition: width 200ms east-in-out; + background-color: inherit; + cursor: pointer; +} +.sidebar-problem-list .sidebar-problem[selected], .sidebar-problem-list .sidebar-problem:hover { + width: calc(100% + 24px); +} +.sidebar-problem-list .sidebar-problem[selected] { + background-color: #42a5f5 !important; +} +.sidebar-problem-list .sidebar-problem:hover { + background-color: #128ef2; +} +.sidebar-problem-list .sidebar-problem-letter { + text-align: center; + background-color: #001929; + padding-top: 20px; + padding-bottom: 20px; + font-size: 1.2rem; +} +.sidebar-problem-list .sidebar-problem-name { + text-align: left; + font-size: 1.2rem; + padding-left: 5px; + padding-top: 20px; + padding-bottom: 20px; + margin-left: 10px; + margin-right: 10px; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:root { + font-size: 16px; +} + +body { + font-family: sans-serif; + background: url(/static/imgs/grain_background.png); + background-color: #111; + background-repeat: repeat; + color: white; +} + +/*# sourceMappingURL=core.css.map */ diff --git a/codebox/static/css/core.css.map b/codebox/static/css/core.css.map new file mode 100644 index 0000000..ce00981 --- /dev/null +++ b/codebox/static/css/core.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../scss/_navbar.scss","../scss/_vars.scss","../scss/problem/_sidebar.scss","../scss/core.scss"],"names":[],"mappings":"AAAA;EACC;EACA;EACA,YCIc;EDHd,QCgBe;EDff;EAEA;EAEA;EACA;;AAEA;EACC;EACA;;AAEA;EACC;EACA;;AAIF;EACC;EACA;EACA;;AAEA;EACC;EACA;EACA;EAEA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA,kBClCY;EDoCZ;;AAEA;EACC;EACA;;;AE/CJ;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;AAIF;EACC;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EAEA;EACA;EACA;EAEA;EACA;;;AC9CF;EACC;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;EAEA;EACA;EACA;EACA","file":"core.css"} \ No newline at end of file diff --git a/codebox/static/imgs/grain_background.png b/codebox/static/imgs/grain_background.png new file mode 100644 index 0000000000000000000000000000000000000000..765bd27816015526743debd7d6f52a3133259307 GIT binary patch literal 1697 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\n\tconsole.log \"Hello world!\"\n" + ] +} \ No newline at end of file diff --git a/codebox/static/scss/_elevate.scss b/codebox/static/scss/_elevate.scss new file mode 100644 index 0000000..7a212bc --- /dev/null +++ b/codebox/static/scss/_elevate.scss @@ -0,0 +1,3 @@ +@mixin elevate($e, $col) { + box-shadow: 0px $e (3 * $e) ($e / 4) $col; +} diff --git a/codebox/static/scss/_navbar.scss b/codebox/static/scss/_navbar.scss new file mode 100644 index 0000000..36ef2d1 --- /dev/null +++ b/codebox/static/scss/_navbar.scss @@ -0,0 +1,52 @@ +.navbar { + z-index: 10000; + width: 100%; + background: $primary-dark; + height: $navbar-height; + position: relative; + + box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.7); + + display: grid; + grid-template-columns: 1fr 6fr 1fr; + + .navbar-logo { + padding-left: 8px; + text-align: center; + + img { + max-height: calc(#{$navbar-height} - 2px); + display: inline; + } + } + + ul { + display: block; + text-align: center; + font-size: 0; + + a li { + margin: 0; + display: inline-block; + cursor: pointer; + + font-size: 24px; + + list-style: none; + line-height: 40px; + padding-left: 30px; + padding-right: 30px; + padding-top: 4px; + + color: darken($white, 5); + border-top-color: $primary-dark; + + transition: 200ms all; + + &.selected, &:hover { + border-bottom: 2px solid $secondary-light; + color: white; + } + } + } +} diff --git a/codebox/static/scss/_utils.scss b/codebox/static/scss/_utils.scss new file mode 100644 index 0000000..3d48d4b --- /dev/null +++ b/codebox/static/scss/_utils.scss @@ -0,0 +1,21 @@ +.content { + width: 100%; + padding: 10px 5%; +} + +.right { + float: right; +} + +.left { + float: left; +} + +.hidden { + visibility: hidden; +} + +a { + text-decoration: none; + color: inherit; +} diff --git a/codebox/static/scss/_vars.scss b/codebox/static/scss/_vars.scss new file mode 100644 index 0000000..ccd82bf --- /dev/null +++ b/codebox/static/scss/_vars.scss @@ -0,0 +1,21 @@ +$white: #fff; +$black: #000; + +$content-background: #232323; + +$primary: #42a5f5; +$primary-light: #80d6ff; +$primary-dark: #0077c2; + +$secondary: #FFD700; +$secondary-light: lighten(#FFD700, 20); +$secondary-dark: darken(#FFD700, 20); + +$primary-text: $white; +$secondary-text: $black; + +$test-case-good: #50ff50; +$test-case-bad: #ff5050; +$test-case-pending: #5050ff; + +$navbar-height: 47px; diff --git a/codebox/static/scss/core.scss b/codebox/static/scss/core.scss new file mode 100644 index 0000000..d76fe8c --- /dev/null +++ b/codebox/static/scss/core.scss @@ -0,0 +1,24 @@ +@import '_vars'; +@import '_elevate'; +@import '_navbar'; +@import 'problem/_list.scss'; +@import 'problem/_sidebar.scss'; + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:root { + font-size: 16px; +} + +body { + font-family: sans-serif; + + background: url(/static/imgs/grain_background.png); + background-color: #111; + background-repeat: repeat; + color: white; +} diff --git a/codebox/static/scss/problem/_list.scss b/codebox/static/scss/problem/_list.scss new file mode 100644 index 0000000..e69de29 diff --git a/codebox/static/scss/problem/_sidebar.scss b/codebox/static/scss/problem/_sidebar.scss new file mode 100644 index 0000000..663b739 --- /dev/null +++ b/codebox/static/scss/problem/_sidebar.scss @@ -0,0 +1,55 @@ +.sidebar-problem-list { + z-index: 50; + box-shadow: 0 10px 0 0 transparent, 0 10px 0 0 transparent, 10px 0 0 0 transparent, 0 8px 8px 2px rgba(0, 0, 0, 0.5); + background: darken($primary-dark, 22); + position: relative; + min-height: calc(100vh - #{$navbar-height}); + + .sidebar-problem { + width: 100%; + + display: grid; + grid-template-columns: 32px 1fr; + + border-left-width: 24px; + border-left-style: solid; + + transition: background-color 200ms east-in-out; + transition: width 200ms east-in-out; + background-color: inherit; + + cursor: pointer; + + &[selected], &:hover { + width: calc(100% + 24px); + } + + &[selected] { + background-color: $primary !important; + } + + &:hover { + background-color: darken($primary, 10); + } + } + + .sidebar-problem-letter { + text-align: center; + background-color: darken($primary-dark, 30); + padding-top: 20px; + padding-bottom: 20px; + font-size: 1.2rem; + } + + .sidebar-problem-name { + text-align: left; + font-size: 1.2rem; + + padding-left: 5px; + padding-top: 20px; + padding-bottom: 20px; + + margin-left: 10px; + margin-right: 10px; + } +} diff --git a/codebox/utils/Tupfile b/codebox/utils/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/utils/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/utils/binding.moon b/codebox/utils/binding.moon new file mode 100644 index 0000000..2f673e0 --- /dev/null +++ b/codebox/utils/binding.moon @@ -0,0 +1,23 @@ +class Binding + new: => + @bindings = {} + @static_bindings = {} + @statics = {} + + bind: (name, service) => + @bindings[name] = service + + bind_static: (name, service) => + @static_bindings[name] = service + + make: (name) => + if @bindings[name] + return @bindings[name]() + elseif @statics[name] + return @statics[name] + elseif @static_bindings[name] + stat = @static_bindings[name]() + @statics[name] = stat + return stat + +return Binding() diff --git a/codebox/views/Tupfile b/codebox/views/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/views/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/views/account/Tupfile b/codebox/views/account/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/views/account/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/views/account/login.moon b/codebox/views/account/login.moon new file mode 100644 index 0000000..0dc3213 --- /dev/null +++ b/codebox/views/account/login.moon @@ -0,0 +1,11 @@ +html = require "lapis.html" + +class Login extends html.Widget + content: => + h1 style: "background-color:red", "Login!" + + form method: 'POST', -> + input type: 'hidden', name: 'csrf_token', value: @csrf_token + input type: 'text', placeholder: 'Username', name: 'username', '' + input type: 'password', placeholder: 'Password', name: 'password', '' + input type: 'submit', value: 'Submit', '' diff --git a/codebox/views/account/register.moon b/codebox/views/account/register.moon new file mode 100644 index 0000000..c0cc4ce --- /dev/null +++ b/codebox/views/account/register.moon @@ -0,0 +1,18 @@ +html = require 'lapis.html' +import to_json from require 'lapis.util' + +class Register extends html.Widget + content: => + h1 style: "background-color:red", "Register" + + p -> + text (to_json @errors) + + form method: 'POST', -> + p -> input type: 'hidden', name: 'csrf_token', value: @csrf_token + p -> input type: 'text', placeholder: 'Username', name: 'username', required: true, '' + p -> input type: 'password', placeholder: 'Password', name: 'password', required: true, '' + p -> input type: 'password', placeholder: 'Confirm Password', name: 'password_confirmation', required: true, '' + p -> input type: 'text', placeholder: 'Email', name: 'email', required: true, '' + p -> input type: 'text', placeholder: 'Display Name', name: 'nickname', required: true, '' + input type: 'submit', value: 'Submit', '' diff --git a/codebox/views/index.moon b/codebox/views/index.moon new file mode 100644 index 0000000..be44bc7 --- /dev/null +++ b/codebox/views/index.moon @@ -0,0 +1,19 @@ +html = require "lapis.html" + +class Index extends html.Widget + content: => + h1 style: "background-color:red", "Hello World!!!" + p "Hello #{@user.nickname}, #{@user.username}, #{@user.email}!" + p "The value is #{@val}" + p "API: #{@api_test}" + + ul -> + for job in *@jobs + li "#{job.lang} - #{job.problem_id} - #{job\get_problem!.name}" + + ul -> + for user in *@users + if user.username == @user.username + li style: "border: 2px solid yellow", "#{user.username} - #{user.email}" + else + li "#{user.username} - #{user.email}" diff --git a/codebox/views/partials/Tupfile b/codebox/views/partials/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/codebox/views/partials/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/codebox/views/partials/layout.moon b/codebox/views/partials/layout.moon new file mode 100644 index 0000000..79d5a08 --- /dev/null +++ b/codebox/views/partials/layout.moon @@ -0,0 +1,14 @@ +html = require "lapis.html" +Navbar = require 'views.partials.navbar' + +class DefaultLayout extends html.Widget + content: => + html_5 -> + head -> + link rel: "stylesheet", href: "static/css/core.css" + + script type: "text/javascript", src: "static/js/main.js" + + body -> + widget Navbar + @content_for "inner" diff --git a/codebox/views/partials/navbar.moon b/codebox/views/partials/navbar.moon new file mode 100644 index 0000000..b55b4d6 --- /dev/null +++ b/codebox/views/partials/navbar.moon @@ -0,0 +1,12 @@ +html = require 'lapis.html' + +class Navigation extends html.Widget + content: => + div class: 'navbar', -> + div class: 'navbar-logo', -> + img src: '/static/imgs/logo.png' + + ul -> + a -> li class: { 'selected': @navbar.selected == 0 }, 'Leaderboard' + a -> li class: { 'selected': @navbar.selected == 1 }, 'Problems' + a -> li class: { 'selected': @navbar.selected == 2 }, 'Submissions' diff --git a/config.env.example b/config.env.example new file mode 100644 index 0000000..6e4578d --- /dev/null +++ b/config.env.example @@ -0,0 +1,6 @@ +APP_SECRET= +REQ_SECRET= + +POSTGRES_DB=codebox +POSTGRES_USER=username +POSTGRES_PASSWORD=bigsecretpassword diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..195f128 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,71 @@ +version: '3' + +services: + codebox: + env_file: + - config.env + build: + context: . + dockerfile: ./docker/codebox/Dockerfile + ports: + - 8888:8888 + volumes: + - ./codebox/app:/app/app + - ./codebox/views:/app/views + - ./codebox/flows:/app/flows + - ./codebox/middleware:/app/middleware + - ./codebox/models:/app/models + - ./codebox/controllers:/app/controllers + - ./codebox/utils:/app/utils + - ./codebox/services:/app/services + - ./codebox/facades:/app/facades + - ./codebox/static:/app/static + command: lapis server development + networks: + appnet: + ipv4_address: 192.168.0.3 + + executer: + env_file: + - config.env + build: + context: . + dockerfile: ./docker/executer/Dockerfile + volumes: + - ./executer/app:/app/app + command: node main.js + networks: + appnet: + ipv4_address: 192.168.0.4 + + postgres: + env_file: + - config.env + image: "postgres:12-alpine" + restart: always + networks: + appnet: + ipv4_address: 192.168.0.2 + logging: + driver: none + +networks: + appnet: + driver: bridge + ipam: + config: + - subnet: 192.168.0.0/16 + +# mysql: +# build: +# context: . +# dockerfile: ./docker/mysql/Dockerfile +# environment: +# MYSQL_ROOT_PASSWORD: secret +# MYSQL_DATABASE: codebox +# MYSQL_USER: mysql +# MYSQL_PASSWORD: secret +# ports: +# - 3306:3306 +# logging: +# driver: none diff --git a/docker/codebox/Dockerfile b/docker/codebox/Dockerfile new file mode 100644 index 0000000..30a1925 --- /dev/null +++ b/docker/codebox/Dockerfile @@ -0,0 +1,29 @@ +FROM openresty/openresty:xenial + +RUN apt-get update \ + && apt-get -y install openssl libssl-dev git \ + && luarocks install lapis \ + && luarocks install lapis-console \ + && luarocks install moonscript \ + # && luarocks install openssl \ + # && luarocks install pgmoon \ + # && luarocks install ansicolors \ + # && luarocks install date \ + # && luarocks install etlua \ + # && luarocks install loadkit \ + # && luarocks install lpeg \ + # && luarocks install lua-cjson \ + # && luarocks install luaossl \ + # && luarocks install luafilesystem \ + # && luarocks install luasocket \ + # && luarocks install mimetypes \ + && luarocks install luacrypto \ + && luarocks install bcrypt + +COPY codebox/ /app + +ENV LAPIS_OPENRESTY "/opt/openresty/nginx/sbin/nginx" + +EXPOSE 8888 80 + +WORKDIR /app diff --git a/docker/executer/Dockerfile b/docker/executer/Dockerfile new file mode 100644 index 0000000..efd1e54 --- /dev/null +++ b/docker/executer/Dockerfile @@ -0,0 +1,16 @@ +FROM node:12.9.1 + +RUN yarn global add coffeescript \ + && apt-get update \ + && apt-get install -y libseccomp-dev python3 + +COPY ./executer/package.json /app/package.json +WORKDIR /app +RUN yarn + +COPY ./executer/Tupfile /app/Tupfile +COPY ./executer/Tuprules.tup /app/Tuprules.tup +COPY ./executer/main.js /app/main.js +COPY ./executer/app /app/app + +ENV PATH $(yarn global bin):$PATH diff --git a/executer/.gitignore b/executer/.gitignore new file mode 100644 index 0000000..c2f7987 --- /dev/null +++ b/executer/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.tup/ +yarn.lock +*.js diff --git a/executer/Tupfile b/executer/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/executer/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/executer/Tuprules.tup b/executer/Tuprules.tup new file mode 100644 index 0000000..9591588 --- /dev/null +++ b/executer/Tuprules.tup @@ -0,0 +1 @@ +: *.coffee |> coffee -c -o %B.js %f |> %B.js diff --git a/executer/app/Tupfile b/executer/app/Tupfile new file mode 100644 index 0000000..f0fe651 --- /dev/null +++ b/executer/app/Tupfile @@ -0,0 +1 @@ +include_rules diff --git a/executer/app/routes.coffee b/executer/app/routes.coffee new file mode 100644 index 0000000..75ea4a5 --- /dev/null +++ b/executer/app/routes.coffee @@ -0,0 +1,22 @@ +request = require 'request' + +module.exports = (app) -> + app.get '/', (req, res) -> + res.json { + test: 'This is test data' + } + + app.post '/submit', (req, res) -> + console.log req.body.lang, req.body.code + + request.post 'http://192.168.0.3:8888/executer/status_update', + { json: true, form: { request_token: process.env.REQ_SECRET } }, + (err, res, body) -> + if err + return console.log err + + console.log body.status + + res.json { + id: 'test' + } diff --git a/executer/main.coffee b/executer/main.coffee new file mode 100644 index 0000000..6216e2d --- /dev/null +++ b/executer/main.coffee @@ -0,0 +1,15 @@ +http = require 'http' +express = require 'express' +morgan = require 'morgan' +bodyParser = require 'body-parser' + +app = express() +app.use (morgan 'dev') +app.use bodyParser.urlencoded { extended: true } + +routes = require './app/routes' +routes(app) + +server = http.createServer(app) +server.listen 8080, -> + console.log 'Started http server on port 8080' diff --git a/executer/package.json b/executer/package.json new file mode 100644 index 0000000..a7fa920 --- /dev/null +++ b/executer/package.json @@ -0,0 +1,14 @@ +{ + "name": "executer", + "version": "1.0.0", + "description": "Executes files", + "main": "main.js", + "author": "Brendan Hansen", + "license": "MIT", + "private": true, + "dependencies": { + "express": "^4.17.1", + "morgan": "^1.9.1", + "request": "^2.88.0" + } +} -- 2.25.1