Index: experimental/webtry/DESIGN.md |
diff --git a/experimental/webtry/DESIGN.md b/experimental/webtry/DESIGN.md |
index 66c7f1f7986537a33f4d099e8e1aab257756a6c6..349a10e4956db7a3539e64f3a5770fcd88fcb26d 100644 |
--- a/experimental/webtry/DESIGN.md |
+++ b/experimental/webtry/DESIGN.md |
@@ -9,6 +9,7 @@ Allows trying out Skia code in the browser. |
Security |
-------- |
+ |
We're putting a C++ compiler on the web, and promising to run the results of |
user submitted code, so security is a large concern. Security is handled in a |
layered approach, using a combination of seccomp-bpf, chroot jail and rlimits. |
@@ -31,6 +32,7 @@ User submitted code is also restricted in the following ways: |
Architecture |
------------ |
+ |
The server runs on GCE, and consists of a Go Web Server that calls out to the |
c++ compiler and executes code in a chroot jail. See the diagram below: |
@@ -114,6 +116,67 @@ calls: |
munmap |
brk |
+Database |
+-------- |
+ |
+Code submitted is stored in an SQL database so that it can be referenced |
+later, i.e. we can let users bookmark their SkFiddles. |
+ |
+The storage layer will be Cloud SQL (a cloud version of MySQL). Back of the |
+envelope estimates of traffic come out to a price of a about $1/month. |
+ |
+All passwords for MySQL are stored in valentine. |
+ |
+To connect to the database from the skia-webtry-b server: |
+ |
+ $ mysql --host=173.194.83.52 --user=root --password |
+ |
+Initial setup of the database, the user, and the only table: |
+ |
+ CREATE DATABASE webtry; |
+ USE webtry; |
+ CREATE USER 'webtry'@'%' IDENTIFIED BY '<password is in valentine>'; |
+ GRANT SELECT, INSERT, UPDATE ON webtry.webtry TO 'webtry'@'%'; |
+ |
+ CREATE TABLE webtry ( |
+ code TEXT DEFAULT '' NOT NULL, |
+ create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, |
+ hash CHAR(64) DEFAULT '' NOT NULL, |
+ PRIMARY KEY(hash) |
+ ); |
+ |
+Common queries webtry.go will use: |
+ |
+ INSERT INTO webtry (code, hash) VALUES('int i = 0;...', 'abcdef...'); |
+ |
+ SELECT code, create_ts, hash FROM webtry WHERE hash='abcdef...'; |
+ |
+ SELECT code, create_ts, hash FROM webtry ORDER BY create_ts DESC LIMIT 2; |
+ |
+ // To change the password for the webtry sql client: |
+ SET PASSWORD for 'webtry'@'%' = PASSWORD('<password is in valentine>'); |
+ |
+ // Run before and after to confirm the password changed: |
+ SELECT Host, User, Password FROM mysql.user; |
+ |
+Password for the database will be stored in the metadata instance, if the |
+metadata server can't be found, i.e. running locally, then data will not be |
+stored. To see the current password stored in metadata and the fingerprint: |
+ |
+ gcutil --project=google.com:skia-buildbots getinstance skia-webtry-b |
+ |
+To set the mysql password that webtry is to use: |
+ |
+ gcutil --project=google.com:skia-buildbots setinstancemetadata skia-webtry-b --metadata=password:'[mysql client webtry password]' --fingerprint=[some fingerprint] |
+ |
+To retrieve the password from the running instance just GET the right URL from |
+the metadata server: |
+ |
+ curl "http://metadata/computeMetadata/v1/instance/attributes/password" -H "X-Google-Metadata-Request: True" |
+ |
+N.B. If you need to change the MySQL password that webtry uses, you must change |
+it both in MySQL and the value stored in the metadata server. |
+ |
Installation |
------------ |
See the README file. |