From ea96618bd48a636ef145d5bec74926861501c3d6 Mon Sep 17 00:00:00 2001 From: Rick Elrod Date: Tue, 3 Dec 2019 16:32:25 +0000 Subject: [PATCH] Get rid of modernpaste everywhere, redirect it to paste.centos.org everywhere Signed-off-by: Rick Elrod --- inventory/group_vars/modernpaste | 9 - .../modernpaste01.phx2.fedoraproject.org | 12 - .../modernpaste01.stg.phx2.fedoraproject.org | 14 - .../modernpaste02.phx2.fedoraproject.org | 12 - inventory/inventory | 8 - master.yml | 2 - playbooks/deactivate_modernpaste_paste.yml | 11 - playbooks/groups/modernpaste.yml | 53 -- playbooks/include/proxies-redirects.yml | 8 +- playbooks/include/proxies-reverseproxy.yml | 6 - playbooks/include/proxies-websites.yml | 3 - playbooks/openshift-apps/modernpaste.yml | 50 -- roles/apps-fp-o/files/apps.yaml | 14 - roles/haproxy/templates/haproxy.cfg | 12 - .../ipsilon/files/oidc_scopes/modernpaste.py | 14 - roles/ipsilon/tasks/main.yml | 24 +- roles/ipsilon/templates/configuration.conf | 2 +- roles/modernpaste/files/deactivate-paste.py | 8 - .../modernpaste/files/fedorapastebin-logo.png | Bin 7363 -> 0 bytes roles/modernpaste/files/paste-info.py | 15 - roles/modernpaste/files/paste.py | 265 --------- roles/modernpaste/files/post.html | 121 ---- roles/modernpaste/tasks/main.yml | 96 --- .../modernpaste/templates/client_secrets.json | 25 - roles/modernpaste/templates/config.ini | 6 - roles/modernpaste/templates/config.py | 117 ---- roles/modernpaste/templates/flask_config.py | 13 - roles/modernpaste/templates/modern-paste.conf | 149 ----- .../templates/nagios/services/websites.cfg.j2 | 8 - .../modernpaste/files/buildconfig.yml | 34 -- .../modernpaste/files/deploymentconfig.yml | 72 --- .../modernpaste/files/imagestream.yml | 6 - .../modernpaste/files/route.yml | 15 - .../modernpaste/files/service.yml | 14 - .../modernpaste/templates/config.py | 93 --- .../modernpaste/templates/configmap.yml | 12 - .../modernpaste/templates/flask_config.py | 7 - .../modernpaste/templates/secret.yml | 10 - roles/paste/files/class_urlshort.php | 40 -- roles/paste/files/show.php | 279 --------- roles/paste/files/skins/fedora/css/fedora.css | 561 ------------------ roles/paste/files/skins/fedora/css/index.html | 1 - .../paste/files/skins/fedora/html/index.html | 1 - .../files/skins/fedora/html/tpl_create.html | 46 -- .../skins/fedora/html/tpl_doc_about.html | 43 -- .../files/skins/fedora/html/tpl_doc_api.html | 145 ----- .../files/skins/fedora/html/tpl_doc_help.html | 82 --- .../files/skins/fedora/html/tpl_footer.html | 20 - .../files/skins/fedora/html/tpl_header.html | 83 --- .../skins/fedora/html/tpl_languages.html | 202 ------- .../files/skins/fedora/html/tpl_list.html | 22 - .../skins/fedora/html/tpl_list_item.html | 19 - .../files/skins/fedora/html/tpl_show.html | 27 - .../skins/fedora/html/tpl_show_password.html | 14 - .../paste/files/skins/fedora/images/about.png | Bin 256 -> 0 bytes roles/paste/files/skins/fedora/images/api.png | Bin 244 -> 0 bytes .../files/skins/fedora/images/background.png | Bin 405 -> 0 bytes .../files/skins/fedora/images/checkmark.png | Bin 239 -> 0 bytes .../files/skins/fedora/images/delicious.png | Bin 565 -> 0 bytes .../paste/files/skins/fedora/images/digg.png | Bin 747 -> 0 bytes .../files/skins/fedora/images/facebook.png | Bin 533 -> 0 bytes .../files/skins/fedora/images/favicon.ico | Bin 3638 -> 0 bytes .../files/skins/fedora/images/favicon.png | Bin 200 -> 0 bytes .../files/skins/fedora/images/fpaste.png | Bin 9628 -> 0 bytes .../images/glyphicons-halflings-white.png | Bin 4352 -> 0 bytes .../fedora/images/glyphicons-halflings.png | Bin 4352 -> 0 bytes .../files/skins/fedora/images/header-bg.png | Bin 251 -> 0 bytes .../paste/files/skins/fedora/images/help.png | Bin 312 -> 0 bytes .../files/skins/fedora/images/identi.png | Bin 672 -> 0 bytes .../files/skins/fedora/images/index.html | 1 - .../paste/files/skins/fedora/images/json.png | Bin 9822 -> 0 bytes .../paste/files/skins/fedora/images/list.png | Bin 117 -> 0 bytes .../files/skins/fedora/images/reddit.png | Bin 681 -> 0 bytes .../files/skins/fedora/images/stumbleupon.png | Bin 777 -> 0 bytes .../files/skins/fedora/images/technorati.png | Bin 719 -> 0 bytes roles/paste/files/skins/fedora/images/xml.png | Bin 11737 -> 0 bytes roles/paste/files/skins/fedora/index.html | 1 - .../files/skins/fedora/js/bootstrap.min.js | 1 - roles/paste/files/skins/fedora/js/index.html | 1 - roles/paste/files/skins/fedora/js/main.js | 132 ----- roles/paste/files/sticky-notes.conf | 55 -- roles/paste/files/sticky-notes.ini | 1 - roles/paste/tasks/main.yml | 54 -- roles/paste/templates/config.php | 158 ----- .../templates/sticky-notes-proxy.conf.erb | 4 - roles/varnish/templates/proxies.vcl.j2 | 13 - 86 files changed, 20 insertions(+), 3326 deletions(-) delete mode 100644 inventory/group_vars/modernpaste delete mode 100644 inventory/host_vars/modernpaste01.phx2.fedoraproject.org delete mode 100644 inventory/host_vars/modernpaste01.stg.phx2.fedoraproject.org delete mode 100644 inventory/host_vars/modernpaste02.phx2.fedoraproject.org delete mode 100644 playbooks/deactivate_modernpaste_paste.yml delete mode 100644 playbooks/groups/modernpaste.yml delete mode 100644 playbooks/openshift-apps/modernpaste.yml delete mode 100644 roles/ipsilon/files/oidc_scopes/modernpaste.py delete mode 100644 roles/modernpaste/files/deactivate-paste.py delete mode 100644 roles/modernpaste/files/fedorapastebin-logo.png delete mode 100644 roles/modernpaste/files/paste-info.py delete mode 100644 roles/modernpaste/files/paste.py delete mode 100644 roles/modernpaste/files/post.html delete mode 100644 roles/modernpaste/tasks/main.yml delete mode 100644 roles/modernpaste/templates/client_secrets.json delete mode 100644 roles/modernpaste/templates/config.ini delete mode 100644 roles/modernpaste/templates/config.py delete mode 100644 roles/modernpaste/templates/flask_config.py delete mode 100644 roles/modernpaste/templates/modern-paste.conf delete mode 100644 roles/openshift-apps/modernpaste/files/buildconfig.yml delete mode 100644 roles/openshift-apps/modernpaste/files/deploymentconfig.yml delete mode 100644 roles/openshift-apps/modernpaste/files/imagestream.yml delete mode 100644 roles/openshift-apps/modernpaste/files/route.yml delete mode 100644 roles/openshift-apps/modernpaste/files/service.yml delete mode 100644 roles/openshift-apps/modernpaste/templates/config.py delete mode 100644 roles/openshift-apps/modernpaste/templates/configmap.yml delete mode 100644 roles/openshift-apps/modernpaste/templates/flask_config.py delete mode 100644 roles/openshift-apps/modernpaste/templates/secret.yml delete mode 100644 roles/paste/files/class_urlshort.php delete mode 100644 roles/paste/files/show.php delete mode 100644 roles/paste/files/skins/fedora/css/fedora.css delete mode 100644 roles/paste/files/skins/fedora/css/index.html delete mode 100644 roles/paste/files/skins/fedora/html/index.html delete mode 100644 roles/paste/files/skins/fedora/html/tpl_create.html delete mode 100644 roles/paste/files/skins/fedora/html/tpl_doc_about.html delete mode 100644 roles/paste/files/skins/fedora/html/tpl_doc_api.html delete mode 100644 roles/paste/files/skins/fedora/html/tpl_doc_help.html delete mode 100644 roles/paste/files/skins/fedora/html/tpl_footer.html delete mode 100644 roles/paste/files/skins/fedora/html/tpl_header.html delete mode 100644 roles/paste/files/skins/fedora/html/tpl_languages.html delete mode 100644 roles/paste/files/skins/fedora/html/tpl_list.html delete mode 100644 roles/paste/files/skins/fedora/html/tpl_list_item.html delete mode 100644 roles/paste/files/skins/fedora/html/tpl_show.html delete mode 100644 roles/paste/files/skins/fedora/html/tpl_show_password.html delete mode 100644 roles/paste/files/skins/fedora/images/about.png delete mode 100644 roles/paste/files/skins/fedora/images/api.png delete mode 100644 roles/paste/files/skins/fedora/images/background.png delete mode 100644 roles/paste/files/skins/fedora/images/checkmark.png delete mode 100644 roles/paste/files/skins/fedora/images/delicious.png delete mode 100644 roles/paste/files/skins/fedora/images/digg.png delete mode 100644 roles/paste/files/skins/fedora/images/facebook.png delete mode 100644 roles/paste/files/skins/fedora/images/favicon.ico delete mode 100644 roles/paste/files/skins/fedora/images/favicon.png delete mode 100644 roles/paste/files/skins/fedora/images/fpaste.png delete mode 100644 roles/paste/files/skins/fedora/images/glyphicons-halflings-white.png delete mode 100644 roles/paste/files/skins/fedora/images/glyphicons-halflings.png delete mode 100644 roles/paste/files/skins/fedora/images/header-bg.png delete mode 100644 roles/paste/files/skins/fedora/images/help.png delete mode 100644 roles/paste/files/skins/fedora/images/identi.png delete mode 100644 roles/paste/files/skins/fedora/images/index.html delete mode 100644 roles/paste/files/skins/fedora/images/json.png delete mode 100644 roles/paste/files/skins/fedora/images/list.png delete mode 100644 roles/paste/files/skins/fedora/images/reddit.png delete mode 100644 roles/paste/files/skins/fedora/images/stumbleupon.png delete mode 100644 roles/paste/files/skins/fedora/images/technorati.png delete mode 100644 roles/paste/files/skins/fedora/images/xml.png delete mode 100644 roles/paste/files/skins/fedora/index.html delete mode 100644 roles/paste/files/skins/fedora/js/bootstrap.min.js delete mode 100644 roles/paste/files/skins/fedora/js/index.html delete mode 100644 roles/paste/files/skins/fedora/js/main.js delete mode 100644 roles/paste/files/sticky-notes.conf delete mode 100644 roles/paste/files/sticky-notes.ini delete mode 100644 roles/paste/tasks/main.yml delete mode 100644 roles/paste/templates/config.php delete mode 100644 roles/paste/templates/sticky-notes-proxy.conf.erb diff --git a/inventory/group_vars/modernpaste b/inventory/group_vars/modernpaste deleted file mode 100644 index 31ef45af90..0000000000 --- a/inventory/group_vars/modernpaste +++ /dev/null @@ -1,9 +0,0 @@ ---- -freezes: false -mem_size: 4096 -num_cpus: 2 -tcp_ports: [22] -proxy_tcp_ports: [80, 443] - -fas_client_groups: paste-deleter -sudoers: "{{ private }}/files/sudo/modernpaste-sudoers" diff --git a/inventory/host_vars/modernpaste01.phx2.fedoraproject.org b/inventory/host_vars/modernpaste01.phx2.fedoraproject.org deleted file mode 100644 index f0dd697deb..0000000000 --- a/inventory/host_vars/modernpaste01.phx2.fedoraproject.org +++ /dev/null @@ -1,12 +0,0 @@ ---- -nm: 255.255.255.0 -gw: 10.5.126.254 -dns: 10.5.126.21 - -ks_url: http://10.5.126.23/repo/rhel/ks/kvm-fedora-27 -ks_repo: http://10.5.126.23/pub/fedora/linux/releases/27/Server/x86_64/os/ - -volgroup: /dev/vg_guests -eth0_ip: 10.5.126.230 -vmhost: virthost12.phx2.fedoraproject.org -datacenter: phx2 diff --git a/inventory/host_vars/modernpaste01.stg.phx2.fedoraproject.org b/inventory/host_vars/modernpaste01.stg.phx2.fedoraproject.org deleted file mode 100644 index cc29b905bc..0000000000 --- a/inventory/host_vars/modernpaste01.stg.phx2.fedoraproject.org +++ /dev/null @@ -1,14 +0,0 @@ ---- -nm: 255.255.255.0 -gw: 10.5.128.254 -dns: 10.5.126.21 - -ks_url: http://10.5.126.23/repo/rhel/ks/kvm-fedora-27 -ks_repo: http://10.5.126.23/pub/fedora/linux/releases/27/Server/x86_64/os/ - -mem_size: 2048 -volgroup: /dev/vg_guests -eth0_ip: 10.5.128.153 -vmhost: virthost03.stg.phx2.fedoraproject.org -datacenter: phx2 -tcp_ports: [22, 80, 443] diff --git a/inventory/host_vars/modernpaste02.phx2.fedoraproject.org b/inventory/host_vars/modernpaste02.phx2.fedoraproject.org deleted file mode 100644 index dfbf7a4f97..0000000000 --- a/inventory/host_vars/modernpaste02.phx2.fedoraproject.org +++ /dev/null @@ -1,12 +0,0 @@ ---- -nm: 255.255.255.0 -gw: 10.5.126.254 -dns: 10.5.126.21 - -ks_url: http://10.5.126.23/repo/rhel/ks/kvm-fedora-27 -ks_repo: http://10.5.126.23/pub/fedora/linux/releases/27/Server/x86_64/os/ - -volgroup: /dev/vg_guests -eth0_ip: 10.5.126.238 -vmhost: virthost14.phx2.fedoraproject.org -datacenter: phx2 diff --git a/inventory/inventory b/inventory/inventory index 3793660717..887611b67e 100644 --- a/inventory/inventory +++ b/inventory/inventory @@ -196,13 +196,6 @@ mdapi01.stg.phx2.fedoraproject.org [minimal] bkernel04.phx2.fedoraproject.org -[modernpaste] -modernpaste01.phx2.fedoraproject.org -modernpaste02.phx2.fedoraproject.org - -[modernpaste_stg] -modernpaste01.stg.phx2.fedoraproject.org - [bodhi_backend] # This one handles the mashing/releng stuff bodhi-backend01.phx2.fedoraproject.org @@ -708,7 +701,6 @@ memcached01.stg.phx2.fedoraproject.org mm-backend01.stg.phx2.fedoraproject.org mm-crawler01.stg.phx2.fedoraproject.org mm-frontend01.stg.phx2.fedoraproject.org -modernpaste01.stg.phx2.fedoraproject.org notifs-backend01.stg.phx2.fedoraproject.org notifs-web01.stg.phx2.fedoraproject.org notifs-web02.stg.phx2.fedoraproject.org diff --git a/master.yml b/master.yml index a815d0b3ab..69db37a7c5 100644 --- a/master.yml +++ b/master.yml @@ -58,7 +58,6 @@ - import_playbook: /srv/web/infra/ansible/playbooks/groups/mariadb-server.yml - import_playbook: /srv/web/infra/ansible/playbooks/groups/mirrormanager.yml - import_playbook: /srv/web/infra/ansible/playbooks/groups/memcached.yml -- import_playbook: /srv/web/infra/ansible/playbooks/groups/modernpaste.yml - import_playbook: /srv/web/infra/ansible/playbooks/groups/noc.yml - import_playbook: /srv/web/infra/ansible/playbooks/groups/notifs-backend.yml - import_playbook: /srv/web/infra/ansible/playbooks/groups/notifs-web.yml @@ -110,7 +109,6 @@ #- import_playbook: /srv/web/infra/ansible/playbooks/openshift-apps/transtats.yml #- import_playbook: /srv/web/infra/ansible/playbooks/openshift-apps/waiverdb.yml # These need work to finish and complete and are all stg currently. -#- import_playbook: /srv/web/infra/ansible/playbooks/openshift-apps/modernpaste.yml #- import_playbook: /srv/web/infra/ansible/playbooks/openshift-apps/rats.yml # diff --git a/playbooks/deactivate_modernpaste_paste.yml b/playbooks/deactivate_modernpaste_paste.yml deleted file mode 100644 index df1d59a871..0000000000 --- a/playbooks/deactivate_modernpaste_paste.yml +++ /dev/null @@ -1,11 +0,0 @@ -# requires --extra-vars="target='modernpaste01.phx2.fedoraproject.org' paste='WMk4~kSfeW1OUNsLjF8hlMnRi-rYnlYzizqToCmG3BY='" -# where target is the box to run it on (usually modernpaste01.phx2 or modernpaste01.stg.phx2) -# and where paste is the encrypted paste ID of the paste. - -- name: Deactivates a modern-paste paste - hosts: "{{ target }}" - user: root - - tasks: - - name: Run deactivate-paste.py - command: "python /usr/local/bin/deactivate-paste.py {{paste}}" diff --git a/playbooks/groups/modernpaste.yml b/playbooks/groups/modernpaste.yml deleted file mode 100644 index 9681a5ed9d..0000000000 --- a/playbooks/groups/modernpaste.yml +++ /dev/null @@ -1,53 +0,0 @@ -# create a new modernpaste server -# NOTE: should be used with --limit most of the time -# NOTE: make sure there is room/space for this server on the vmhost -# NOTE: most of these vars_path come from group_vars/mirrorlist or from hostvars - -- import_playbook: "/srv/web/infra/ansible/playbooks/include/virt-create.yml myhosts=modernpaste_stg:modernpaste" - -- name: dole out the generic configuration - hosts: modernpaste_stg:modernpaste - user: root - gather_facts: True - - vars_files: - - /srv/web/infra/ansible/vars/global.yml - - "/srv/private/ansible/vars.yml" - - /srv/web/infra/ansible/vars/{{ ansible_distribution }}.yml - - roles: - - base - - rkhunter - - nagios_client - - hosts - - fas_client - - sudo - - collectd/base - - fedmsg/base - - { role: openvpn/client, when: env != "staging" } - - pre_tasks: - - import_tasks: "{{ tasks_path }}/yumrepos.yml" - - tasks: - - import_tasks: "{{ tasks_path }}/2fa_client.yml" - - import_tasks: "{{ tasks_path }}/motd.yml" - - handlers: - - import_tasks: "{{ handlers_path }}/restart_services.yml" - -- name: dole out the service-specific config - hosts: modernpaste_stg:modernpaste - user: root - gather_facts: True - - roles: - - modernpaste - - vars_files: - - /srv/web/infra/ansible/vars/global.yml - - "/srv/private/ansible/vars.yml" - - "{{ vars_path }}/{{ ansible_distribution }}.yml" - - handlers: - - import_tasks: "{{ handlers_path }}/restart_services.yml" diff --git a/playbooks/include/proxies-redirects.yml b/playbooks/include/proxies-redirects.yml index c139315406..0add2a9c90 100644 --- a/playbooks/include/proxies-redirects.yml +++ b/playbooks/include/proxies-redirects.yml @@ -91,7 +91,13 @@ shortname: fpaste website: fpaste.org regex: /(.*)$ - target: https://paste.fedoraproject.org/$1 + target: https://paste.centos.org/$1 + + - role: httpd/redirectmatch + shortname: modernpaste + website: paste.fedoraproject.org + regex: /(.*)$ + target: https://paste.centos.org/$1 - role: httpd/redirectmatch shortname: elections diff --git a/playbooks/include/proxies-reverseproxy.yml b/playbooks/include/proxies-reverseproxy.yml index a701ba7ec2..11a2f5ea80 100644 --- a/playbooks/include/proxies-reverseproxy.yml +++ b/playbooks/include/proxies-reverseproxy.yml @@ -129,12 +129,6 @@ destname: askbot proxyurl: "{{ varnish_url }}" - - role: httpd/reverseproxy - website: paste.fedoraproject.org - destname: modernpaste - keephost: true - proxyurl: "{{ varnish_url }}" - - role: httpd/reverseproxy website: awx.fedoraproject.org destname: awx diff --git a/playbooks/include/proxies-websites.yml b/playbooks/include/proxies-websites.yml index 7fafaeec16..c7b8730521 100644 --- a/playbooks/include/proxies-websites.yml +++ b/playbooks/include/proxies-websites.yml @@ -542,9 +542,6 @@ - role: httpd/website site_name: paste.fedoraproject.org - server_aliases: - - paste.stg.fedoraproject.org - - modernpaste.stg.fedoraproject.org sslonly: true cert_name: "{{wildcard_cert_name}}" diff --git a/playbooks/openshift-apps/modernpaste.yml b/playbooks/openshift-apps/modernpaste.yml deleted file mode 100644 index d21aca88f8..0000000000 --- a/playbooks/openshift-apps/modernpaste.yml +++ /dev/null @@ -1,50 +0,0 @@ -- name: make the app be real - hosts: os_masters_stg[0] - user: root - gather_facts: False - - vars_files: - - /srv/web/infra/ansible/vars/global.yml - - "/srv/private/ansible/vars.yml" - - /srv/web/infra/ansible/vars/{{ ansible_distribution }}.yml - - roles: - - role: openshift/project - app: modernpaste - description: modernpaste - appowners: - - codeblock - - role: openshift/object - app: modernpaste - file: imagestream.yml - - role: openshift/object - app: modernpaste - template: secret.yml - - role: openshift/object - app: modernpaste - template: buildconfig.yml - objectname: buildconfig.yml - - role: openshift/start-build - app: modernpaste - buildname: modernpaste-docker-build - - role: openshift/object - app: modernpaste - template: configmap.yml - objectname: configmap.yml - - role: openshift/object - app: modernpaste - file: service.yml - objectname: service.yml - - role: openshift/object - app: modernpaste - file: route.yml - routename: modernpaste - serviceport: web - servicename: modernpaste - - role: openshift/object - app: modernpaste - file: deploymentconfig.yml - objectname: deploymentconfig.yml - - role: openshift/rollout - app: modernpaste - dcname: modernpaste-web diff --git a/roles/apps-fp-o/files/apps.yaml b/roles/apps-fp-o/files/apps.yaml index fd2d16d67a..8b7479b284 100644 --- a/roles/apps-fp-o/files/apps.yaml +++ b/roles/apps-fp-o/files/apps.yaml @@ -291,20 +291,6 @@ children: Fedora? This site is a starting place for brand new contributors to help them figure out where they can hop on board! - - name: Paste - data: - url: https://paste.fedoraproject.org - source_url: https://github.com/sayakb/sticky-notes - # Theme is from https://github.com/athmane/sticky-notes-fedora-skin - bugs_url: https://github.com/sayakb/sticky-notes/pulls - docs_url: https://sayakb.github.io/sticky-notes/pages/home/ - sops: - - https://infrastructure.fedoraproject.org/infra/docs/fedorapastebin.rst - status_mappings: ['fedorapaste'] - description: > - Our very own pastebin server. If you yum install the - fpaste command, it will use this site - automatically. - name: Elections data: url: https://elections.fedoraproject.org/ diff --git a/roles/haproxy/templates/haproxy.cfg b/roles/haproxy/templates/haproxy.cfg index 7dc29be09b..323f6bc20d 100644 --- a/roles/haproxy/templates/haproxy.cfg +++ b/roles/haproxy/templates/haproxy.cfg @@ -358,18 +358,6 @@ backend oci-candidate-registry-backend balance hdr(appserver) server oci-candidate-registry01 oci-candidate-registry01:5000 check inter 10s rise 1 fall 2 -frontend modernpaste-frontend - bind 0.0.0.0:10055 - default_backend modernpaste-backend - -backend modernpaste-backend - balance hdr(appserver) - server modernpaste01 modernpaste01:80 check inter 10s rise 1 fall 2 -{% if env == "production" %} - server modernpaste02 modernpaste02:80 check inter 10s rise 1 fall 2 -{% endif %} - option httpchk GET / - {% if 'phx2' in inventory_hostname %} # Only enable this on phx2 proxies diff --git a/roles/ipsilon/files/oidc_scopes/modernpaste.py b/roles/ipsilon/files/oidc_scopes/modernpaste.py deleted file mode 100644 index 6df08853d9..0000000000 --- a/roles/ipsilon/files/oidc_scopes/modernpaste.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import absolute_import - -from ipsilon.providers.openidc.plugins.common import OpenidCExtensionBase - - -class OpenidCExtension(OpenidCExtensionBase): - name = 'modernpaste' - display_name = 'Modern Paste' - scopes = { - 'https://paste.fedoraproject.org/' { - 'display_name': 'authenticated modernpaste access', - 'claims': [], - }, - } diff --git a/roles/ipsilon/tasks/main.yml b/roles/ipsilon/tasks/main.yml index ab94dab8b7..14d343eb62 100644 --- a/roles/ipsilon/tasks/main.yml +++ b/roles/ipsilon/tasks/main.yml @@ -56,18 +56,18 @@ - ipsilon - ipsilon/oidc_scopes -- name: Copy OpenID Connect scope registrations (STAGING) - copy: src=oidc_scopes/{{item}}.py - dest=/usr/lib/python2.7/site-packages/ipsilon/providers/openidc/plugins/{{item}}.py - owner=root group=root mode=0644 - when: env == "staging" - with_items: - - modernpaste - notify: - - reload apache - tags: - - ipsilon - - ipsilon/oidc_scopes +#- name: Copy OpenID Connect scope registrations (STAGING) +# copy: src=oidc_scopes/{{item}}.py +# dest=/usr/lib/python2.7/site-packages/ipsilon/providers/openidc/plugins/{{item}}.py +# owner=root group=root mode=0644 +# when: env == "staging" +# with_items: +# - +# notify: +# - reload apache +# tags: +# - ipsilon +# - ipsilon/oidc_scopes - name: Apply hotfix for taiga to get POST results copy: src=openid_server.py diff --git a/roles/ipsilon/templates/configuration.conf b/roles/ipsilon/templates/configuration.conf index be676b0e74..423fb2918e 100644 --- a/roles/ipsilon/templates/configuration.conf +++ b/roles/ipsilon/templates/configuration.conf @@ -25,7 +25,7 @@ global enabled=openid,saml2,openidc {% if env == "production" %} openidc enabled extensions=fedora-account,mbs,beaker,waiverdb,odcs,wiki,src,fpdc,kerneltest {% else %} -openidc enabled extensions=fedora-account,mbs,beaker,waiverdb,odcs,wiki,src,modernpaste,fpdc,kerneltest +openidc enabled extensions=fedora-account,mbs,beaker,waiverdb,odcs,wiki,src,fpdc,kerneltest {% endif %} {% if env == 'staging' %} diff --git a/roles/modernpaste/files/deactivate-paste.py b/roles/modernpaste/files/deactivate-paste.py deleted file mode 100644 index e2c7011dff..0000000000 --- a/roles/modernpaste/files/deactivate-paste.py +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env python -import sys -sys.path.append('/usr/share/modern-paste/app') -import modern_paste -from util.cryptography import get_decid -from database.paste import deactivate_paste - -print(deactivate_paste(get_decid(sys.argv[1]))) diff --git a/roles/modernpaste/files/fedorapastebin-logo.png b/roles/modernpaste/files/fedorapastebin-logo.png deleted file mode 100644 index 4b8f52127c5258d321e5f1a69d93dcc233c852de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7363 zcmaJ`Ra6uVxLlNyB}8fI?(U_eJC|+&kzBgjr6dGIBt#k{my+(55F`bb?q13zmgb)S z{oea9XC7wGJbmYTn2FQXRw2Nn!UF&R1Zt{^`Tzh17ytn1;$i~;0A-&K_O4Z*dK1pojqJXB4+0RWnq|A3LS^UnbQ08siUnfMq$-uw95dN~06{r!2J++Dow zY&{%!AzqGICsI@Z0JWT&;#+V)_Hj;d2za*fx*Pdt`|UIKd|YSJa&XmkSt03**uu_d zFXUNMUNDlH7thN7{`lY9$;g=3?RHyow<&us-!4sgW}LM+e()SJQq6 z+taC6(+>R96+SHtPuUXQ+Pbs+Dtv@@O6y;f5lOp!Kwjs% zzJURkm$!F?o!#Y>-F)gS;+p0$SjmC?Oa9rP=#Gop+8GJvX4kf!NP3;ry~IZ~ZeL3L zAwimV!?OM-%YTWVLI%3EK$&33sqhoVajhb)hrtI2-2_rsGDN z6^QPHy&`ri%xXzaZ$Bg#^~)_2meR#kCdj)`M=i1#8xN@0&>!UEO0pVB;zw_Vw}56A z>K*f{^wF#y?=<-Sh%`2i%^^gs^TI}y7^NgndvSQN++8ZFYMI@f50vtOFEsnFNz>!% zOnCyi(#J{U^oZp^>#+ki`rTUw6Y(Yfx-`qt#bo5yoN6&`~L!PesXcS&TNn#3M}*paH8cxAr0dNu6Gg2Z35 z1woywBsStb1eA6M3-t)%OY&9|QgtscLD`ObJip`B-z8e7g~ROm{o-J~R_1GHOYlRX z9xSn50y}bpKekoD(C|A5Hb>#wO1yz1H;mUI2~d%j?;{5Nots9dcDXKI@G{=UOPs%7 zq2`vsMak@|$1ux45tjZmuH<&|#BJEJp#(G#D8h!nK~t0FaJki6CkMU${3E?W;lwx= z9*@(|e$~29g#5EfCX>bI7e4D|-Im@H%dPdSe=`&^?&XNlU-k=1H#7dDP5++DV}FX@O<2fSKgZ)ef)6iU5-sd0 zOJQ1Y^5f52=6+k{QeVOe+h&*S?wfuyN^W0S#fK|-l7xZzy~=}S-|+IXFr)*jcMAw> z0BOY7jq2w^QoA15fw%5885`#gcUjlt*a|U>?;&NPjWDKtO&UU+Z`OWTdwH^7W>ROc zzvqDb&o1iN>>T9lvjYdeCv^5=$+=nb>NL) zhugpOFj`|co3j9h5MI}wVXR-8eO@WY%BSr0qYG=qJEBsoR-(jAQ1xL>%{k@iaE=#i zFR@ZsoTE{oMWuX7BGVih%wB9AL5$Cjnh*!hMmF6LfAQVFz~;diIQaPiEnQ|5xOc%5NtTp6K^1v z?uwW(43gGa-{2oBYf>K`;XDP4kNCdyC^_LKa?G8oNwz?rtb~UtoZmf&Q-3zec&+Sf zNdJt3g(Yo!yGO%V@V7-kuTn_!(}GmvMa|JlJ9&PL_3M)7LUs-sH+>0S>mgwc%XLIy zrxDw6}c&tR7v1muF-WYmuy~7MRz3A%^-+6>wPL0^#ROq z2U*X9ZCEyJxCEPfodwt#y3&`BbO@Y4ld+Dtr@!btLQ%x8;%Um-eL=7--~K zbhB@rR<)L5D@esnZ5QuUKl%Jq`ljex0$6F!ll#WYG2b+14uK>jaxj36jcc9G+W{8` ze@pd3ot-%mpRbdmT@05Kqc$T#Rn8QOS?}0lK)h3z(rX<=^LSy!&7w14kPz

v+`s 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 0: - return ( - flask.jsonify(constants.api.PASTE_ATTACHMENTS_DISABLED_FAILURE), - constants.api.PASTE_ATTACHMENTS_DISABLED_FAILURE_CODE, - ) - - is_attachment_too_large = [ - # The data is encoded as a string: each character takes 1 B - # The base64-encoded string is at 4/3x larger in size than the raw file - len(attachment.get('data', '')) * 3 / 4.0 > config.MAX_ATTACHMENT_SIZE * 1000 * 1000 - for attachment in data.get('attachments', []) - ] - if any(is_attachment_too_large) and config.MAX_ATTACHMENT_SIZE > 0: - return ( - flask.jsonify(constants.api.PASTE_ATTACHMENT_TOO_LARGE_FAILURE), - constants.api.PASTE_ATTACHMENT_TOO_LARGE_FAILURE_CODE, - ) - - expire_hardcode = (datetime.datetime.now() + datetime.timedelta(weeks=1)).strftime('%s') - expiry_time_given = data.get('expiry_time') - if expiry_time_given: - if int(expiry_time_given) > int(expire_hardcode): - return ( - flask.jsonify( - { 'success': False, - 'message': 'Pastes can only have an expiry of one week.', - 'failure': 'paste_expiry_too_far_failure' - } - ), - 400 - ) - else: - expire_hardcode = expiry_time_given - - try: - new_paste = database.paste.create_new_paste( - contents=data.get('contents'), - user_id=current_user.user_id if current_user.is_authenticated else None, - #expiry_time=data.get('expiry_time'), - expiry_time=expire_hardcode, - title=data.get('title'), - language=data.get('language'), - password=data.get('password'), - # The paste is considered an API post if any of the following conditions are met: - # (1) The referrer is null. - # (2) The Home or PastePostInterface URIs are *not* contained within the referrer string (if a paste was - # posted via the web interface, this is where the user should be coming from, unless the client performed - # some black magic and spoofed the referrer string or something equally sketchy). - is_api_post=not flask.request.referrer or not any( - [uri in flask.request.referrer for uri in [HomeURI.full_uri(), PastePostInterfaceURI.full_uri()]] - ), - ) - new_attachments = [ - database.attachment.create_new_attachment( - paste_id=new_paste.paste_id, - file_name=attachment.get('name'), - file_size=attachment.get('size'), - mime_type=attachment.get('mime_type'), - file_data=attachment.get('data'), - ) - for attachment in data.get('attachments', []) - ] - resp_data = new_paste.as_dict().copy() - resp_data['attachments'] = [ - { - 'name': attachment.file_name, - 'size': attachment.file_size, - 'mime_type': attachment.mime_type, - } - for attachment in new_attachments - ] - return flask.jsonify(resp_data), constants.api.SUCCESS_CODE - except: - return flask.jsonify(constants.api.UNDEFINED_FAILURE), constants.api.UNDEFINED_FAILURE_CODE - - -@app.route(PasteDeactivateURI.path, methods=['POST']) -@require_form_args(['paste_id']) -@optional_login_api -def deactivate_paste(): - """ - Endpoint for deactivating an existing paste. - The user can deactivate a paste with this endpoint in two ways: - (1) Supply a deactivation token in the request, or - (2) Be currently logged in, and own the paste. - """ - data = flask.request.get_json() - try: - paste = database.paste.get_paste_by_id(util.cryptography.get_decid(data['paste_id']), active_only=True) - if (current_user.is_authenticated and current_user.user_id == paste.user_id) or data.get('deactivation_token') == paste.deactivation_token: - database.paste.deactivate_paste(paste.paste_id) - return flask.jsonify({ - constants.api.RESULT: constants.api.RESULT_SUCCESS, - constants.api.MESSAGE: None, - 'paste_id': util.cryptography.get_id_repr(paste.paste_id), - }), constants.api.SUCCESS_CODE - fail_msg = 'User does not own requested paste' if current_user.is_authenticated else 'Deactivation token is invalid' - return flask.jsonify({ - constants.api.RESULT: constants.api.RESULT_FAULURE, - constants.api.MESSAGE: fail_msg, - constants.api.FAILURE: 'auth_failure', - 'paste_id': util.cryptography.get_id_repr(paste.paste_id), - }), constants.api.AUTH_FAILURE_CODE - except (PasteDoesNotExistException, InvalidIDException): - return flask.jsonify(constants.api.NONEXISTENT_PASTE_FAILURE), constants.api.NONEXISTENT_PASTE_FAILURE_CODE - except: - return flask.jsonify(constants.api.UNDEFINED_FAILURE), constants.api.UNDEFINED_FAILURE_CODE - - -@app.route(PasteSetPasswordURI.path, methods=['POST']) -@require_form_args(['paste_id', 'password'], allow_blank_values=True) -@require_login_api -def set_paste_password(): - """ - Modify a paste's password, unset it, or set a new one. - """ - data = flask.request.get_json() - try: - paste = database.paste.get_paste_by_id(util.cryptography.get_decid(data['paste_id']), active_only=True) - if paste.user_id != current_user.user_id: - return flask.jsonify({ - constants.api.RESULT: constants.api.RESULT_FAULURE, - constants.api.MESSAGE: 'User does not own the specified paste', - constants.api.FAILURE: 'auth_failure', - 'paste_id': util.cryptography.get_id_repr(paste.paste_id), - }), constants.api.AUTH_FAILURE_CODE - database.paste.set_paste_password(paste.paste_id, data['password']) - return flask.jsonify({ - constants.api.RESULT: constants.api.RESULT_SUCCESS, - constants.api.MESSAGE: None, - 'paste_id': util.cryptography.get_id_repr(paste.paste_id), - }), constants.api.SUCCESS_CODE - except (PasteDoesNotExistException, InvalidIDException): - return flask.jsonify(constants.api.NONEXISTENT_PASTE_FAILURE), constants.api.NONEXISTENT_PASTE_FAILURE_CODE - except: - return flask.jsonify(constants.api.UNDEFINED_FAILURE), constants.api.UNDEFINED_FAILURE_CODE - - -@app.route(PasteDetailsURI.path, methods=['POST']) -@require_form_args(['paste_id']) -def paste_details(): - """ - Retrieve details for a particular paste ID. - """ - data = flask.request.get_json() - try: - paste = database.paste.get_paste_by_id(util.cryptography.get_decid(data['paste_id']), active_only=True) - attachments = database.attachment.get_attachments_for_paste(util.cryptography.get_decid(data['paste_id']), active_only=True) - paste_details_dict = paste.as_dict() - paste_details_dict['poster_username'] = 'Anonymous' - paste_details_dict['attachments'] = [ - attachment.as_dict() - for attachment in attachments - ] - if paste.user_id: - poster = database.user.get_user_by_id(paste.user_id) - paste_details_dict['poster_username'] = poster.username - if not paste.password_hash or (data.get('password') and paste.password_hash == util.cryptography.secure_hash(data.get('password'))): - return flask.jsonify({ - constants.api.RESULT: constants.api.RESULT_SUCCESS, - constants.api.MESSAGE: None, - 'details': paste_details_dict, - }), constants.api.SUCCESS_CODE - else: - return flask.jsonify({ - constants.api.RESULT: constants.api.RESULT_FAULURE, - constants.api.MESSAGE: 'Password-protected paste: either no password or wrong password supplied', - constants.api.FAILURE: 'password_mismatch_failure', - 'details': {}, - }), constants.api.AUTH_FAILURE_CODE - except (PasteDoesNotExistException, UserDoesNotExistException, InvalidIDException): - return flask.jsonify(constants.api.NONEXISTENT_PASTE_FAILURE), constants.api.NONEXISTENT_PASTE_FAILURE_CODE - except: - return flask.jsonify(constants.api.UNDEFINED_FAILURE), constants.api.UNDEFINED_FAILURE_CODE - - -@app.route(PastesForUserURI.path, methods=['POST']) -@require_login_api -def pastes_for_user(): - """ - Get all pastes for the currently logged in user. - """ - try: - return flask.jsonify({ - constants.api.RESULT: constants.api.RESULT_SUCCESS, - constants.api.MESSAGE: None, - 'pastes': [ - paste.as_dict() - for paste in database.paste.get_all_pastes_for_user(current_user.user_id, active_only=True) - ], - }), constants.api.SUCCESS_CODE - except: - return flask.jsonify(constants.api.UNDEFINED_FAILURE), constants.api.UNDEFINED_FAILURE_CODE - - -@app.route(RecentPastesURI.path, methods=['POST']) -@require_form_args(['page_num', 'num_per_page']) -def recent_pastes(): - """ - Get details for the most recent pastes. - """ - try: - data = flask.request.get_json() - return flask.jsonify({ - constants.api.RESULT: constants.api.RESULT_SUCCESS, - constants.api.MESSAGE: None, - 'pastes': [ - paste.as_dict() for paste in database.paste.get_recent_pastes(data['page_num'], data['num_per_page']) - ], - }), constants.api.SUCCESS_CODE - except: - return flask.jsonify(constants.api.UNDEFINED_FAILURE), constants.api.UNDEFINED_FAILURE_CODE - - -@app.route(TopPastesURI.path, methods=['POST']) -@require_form_args(['page_num', 'num_per_page']) -def top_pastes(): - """ - Get details for the top pastes. - """ - try: - data = flask.request.get_json() - return flask.jsonify({ - constants.api.RESULT: constants.api.RESULT_SUCCESS, - constants.api.MESSAGE: None, - 'pastes': [ - paste.as_dict() for paste in database.paste.get_top_pastes(data['page_num'], data['num_per_page']) - ], - }), constants.api.SUCCESS_CODE - except: - return flask.jsonify(constants.api.UNDEFINED_FAILURE), constants.api.UNDEFINED_FAILURE_CODE diff --git a/roles/modernpaste/files/post.html b/roles/modernpaste/files/post.html deleted file mode 100644 index 21451dd1aa..0000000000 --- a/roles/modernpaste/files/post.html +++ /dev/null @@ -1,121 +0,0 @@ -{% extends 'base.html' %} - -{% block title %} - Modern Paste -{% endblock %} - -{% block head %} - {{ super() }} - - {{ import_css([ - 'lib/date-time-picker/jquery.datetimepicker.css', - 'lib/codemirror/lib/codemirror.css', - ])|safe }} - - {{ import_js([ - 'lib/date-time-picker/build/jquery.datetimepicker.full.min.js', - 'lib/codemirror/lib/codemirror.js', - 'paste/PostController.js', - ])|safe }} - - {% if config.BUILD_ENVIRONMENT == 'dev' %} - {% for language in config.LANGUAGES %} - {% if language != 'text' %} - {{ import_js(['lib/codemirror/mode/' ~ language ~ '/' ~ language ~ '.js'], defer=True)|safe }} - {% endif %} - {% endfor %} - {% else %} - {{ import_js(['paste/modes.js'], defer=True)|safe }} - {% endif %} -{% endblock %} - -{% block content %} - -

- - - - - - - - - {% if config.ENABLE_PASTE_ATTACHMENTS %} - - {% endif %} - - -
-

PASTE CONTENTS

-
-
- - - - -
-
-

-
- - -{% endblock %} diff --git a/roles/modernpaste/tasks/main.yml b/roles/modernpaste/tasks/main.yml deleted file mode 100644 index c6e691d92d..0000000000 --- a/roles/modernpaste/tasks/main.yml +++ /dev/null @@ -1,96 +0,0 @@ ---- -- name: install needed packages - package: name={{ item }} state=present - with_items: - - python-psycopg2 - - httpd - - mod_wsgi - - python2-mock - - modern-paste - - stickynotes2modernpaste - - python2-flask-oidc - tags: - - packages - - modernpaste - -- name: modernpaste config - template: src=config.py dest=/etc/modern-paste/config.py owner=apache group=apache mode=600 - tags: - - config - - modernpaste - notify: reload httpd - -- name: stickynotes2modernpaste config - template: src=config.ini dest=/etc/stickynotes2modernpaste/config.ini owner=root group=root mode=644 - tags: - - config - - modernpaste - notify: reload httpd - -- name: modernpaste flask config - template: src=flask_config.py dest=/etc/modern-paste/flask_config.py owner=apache group=apache mode=600 - tags: - - config - - modernpaste - notify: reload httpd - -- name: modernpaste oidc secrets - template: src=client_secrets.json dest=/etc/modern-paste/client_secrets.json owner=apache group=apache mode=600 - when: env == 'staging' - tags: - - config - - modernpaste - notify: reload httpd - -- name: modernpaste apache config - template: src=modern-paste.conf dest=/etc/httpd/conf.d/modern-paste.conf owner=root group=root mode=644 - tags: - - config - - modernpaste - notify: reload httpd - -- name: Apply modernpaste hotfixes for forcing 1 week expiry (1) - copy: src=post.html dest=/usr/share/modern-paste/app/templates/paste/post.html owner=root group=root mode=644 - when: env != 'staging' - tags: - - hotfix - - modernpaste - notify: reload httpd - -- name: Apply modernpaste hotfixes for forcing 1 week expiry (2) - copy: src=paste.py dest=/usr/share/modern-paste/app/api/paste.py owner=root group=root mode=644 - when: env != 'staging' - tags: - - hotfix - - modernpaste - notify: reload httpd - -- name: Add fedora pastebin logo here for now due to packaging bug on relrod's part - copy: src=fedorapastebin-logo.png dest=/usr/share/modern-paste/app/static/img/fedorapastebin-logo.png owner=root group=root mode=644 - tags: - - modernpaste - -- name: Script for manual paste deactivation - copy: src=deactivate-paste.py dest=/usr/local/bin/deactivate-paste.py owner=root group=root mode=755 - tags: - - modernpaste - -- name: Script for paste information - copy: src=paste-info.py dest=/usr/local/bin/paste-info.py owner=root group=root mode=755 - tags: - - modernpaste - -- name: set sebooleans so paste can talk to the db and sn2mp can talk to paste - seboolean: name={{item}} state=true persistent=true - with_items: - - httpd_can_network_connect_db - - httpd_can_network_connect - tags: - - config - - selinux - - modernpaste - -- name: startup apache - service: name=httpd enabled=yes state=started - tags: - - modernpaste diff --git a/roles/modernpaste/templates/client_secrets.json b/roles/modernpaste/templates/client_secrets.json deleted file mode 100644 index b7ff49843b..0000000000 --- a/roles/modernpaste/templates/client_secrets.json +++ /dev/null @@ -1,25 +0,0 @@ -{% if env == 'staging' %} -{"web": { - "redirect_uris": ["https://modernpaste.stg.fedoraproject.org/oidc_callback"], - "token_uri": "https://id.stg.fedoraproject.org/openidc/Token", - "auth_uri": "https://id.stg.fedoraproject.org/openidc/Authorization", - "client_id": "modernpaste", - "client_secret": "{{stg_modernpaste_oidc_secret}}", - "userinfo_uri": "https://id.stg.fedoraproject.org/openidc/UserInfo", - "token_introspection_uri": "https://id.stg.fedoraproject.org/openidc/TokenInfo", - "issuer": ["https://id.stg.fedoraproject.org/openidc/"] - } -} -{% else %} -{"web": { - "redirect_uris": ["https://modernpaste.stg.fedoraproject.org/oidc_callback"], - "token_uri": "https://id.fedoraproject.org/openidc/Token", - "auth_uri": "https://id.fedoraproject.org/openidc/Authorization", - "client_id": "modernpaste", - "client_secret": "{{prod_modernpaste_oidc_secret}}", - "userinfo_uri": "https://id.fedoraproject.org/openidc/UserInfo", - "token_introspection_uri": "https://id.fedoraproject.org/openidc/TokenInfo", - "issuer": ["https://id.stg.fedoraproject.org/openidc/"] - } -} -{% endif %} diff --git a/roles/modernpaste/templates/config.ini b/roles/modernpaste/templates/config.ini deleted file mode 100644 index df00643bd7..0000000000 --- a/roles/modernpaste/templates/config.ini +++ /dev/null @@ -1,6 +0,0 @@ -[stickynotes2modernpaste] -{% if env == 'staging' %} -modernpaste = https://paste.stg.fedoraproject.org -{% else %} -modernpaste = https://paste.fedoraproject.org -{% endif %} diff --git a/roles/modernpaste/templates/config.py b/roles/modernpaste/templates/config.py deleted file mode 100644 index 752d25acb4..0000000000 --- a/roles/modernpaste/templates/config.py +++ /dev/null @@ -1,117 +0,0 @@ -import constants - - -# Domain from which you will access this app -# If running on a port other than 80, append it after a colon at the end of the domain, e.g. 'domain.com:8080' -{% if env == 'staging' %} -DOMAIN = 'modernpaste.stg.fedoraproject.org' -{% else %} -DOMAIN = 'paste.fedoraproject.org' -{% endif %} - -# Use HTTPS by default? -# This is only used for deciding whether to use the http:// or https:// prefix when constructing full URLs, -# and is not related to your web server configuration. -DEFAULT_HTTPS = True - -# The type of build environment -# build_environment.DEV won't minify CSS and Closure-compile JavaScript; build_environment.PROD will. -# Dev and prod environments also use separate databases, modern_paste_dev and modern_paste, respectively. -BUILD_ENVIRONMENT = constants.build_environment.PROD - -# Option to use encrypted IDs rather than integer IDs -# Set this to True if you want paste IDs to be encrypted, e.g. displayed as h0GZ19np17iT~CtpuIH3NcnRi-rYnlYzizqToCmG3BY= -# If False, IDs will be displayed as regular, incrementing integers, e.g. 1, 2, 3, etc. -USE_ENCRYPTED_IDS = True - -# Choose to allow paste attachments -# This will allow for users to attach files and images to pastes. If disabled, the MAX_ATTACHMENT_SIZE and -# ATTACHMENTS_DIR configuration constants will be ignored. -ENABLE_PASTE_ATTACHMENTS = False - -# Allow only paste attachments below a certain size threshold, in MB -# Set this to 0 for an unlimited file size. -MAX_ATTACHMENT_SIZE = 5 - -# Location to store paste attachments -# Please use an absolute path and ensure that it is writable by www-data. -ATTACHMENTS_DIR = '/var/www/modern-paste-attachments' - -# Choose to enable or disable user registration -# If False, the web interface will not allow access to the user registration page. Additionally, the API endpoint -# for creating new users will respond with an error. -# This is useful for private or internal installations that aren't intended for public use. -ENABLE_USER_REGISTRATION = False - -# Choose to require users to be logged in to post pastes -# If True, the web interface will allow access to the paste post interface only if the user is signed in. Additionally, -# the API endpoint for creating new pastes will respond with an error if not authenticated with an API key tied to an -# existing, active user. -# This is useful for private or internal installations that aren't intended for public use. -REQUIRE_LOGIN_TO_PASTE = False - -# Authentication method -# This selects between either local users or oidc (OpenID Connect) -{% if env == 'staging' %} -AUTH_METHOD = 'oidc' -{% else %} -AUTH_METHOD = 'local' -{% endif %} - -# OpenID Connect client secrets file -AUTH_OIDC_CLIENT_SECRETS = '/etc/modern-paste/client_secrets.json' - -# Required scope for OAuth2 API calls -AUTH_OIDC_SCOPE = 'modernpaste' - -# AES key for generating encrypted IDs -# This is only relevant if USE_ENCRYPTED_IDS above is True. If not, this config parameter can be ignored. -# It is recommended, but not strictly required, for you to replace the string below with the output of os.urandom(32), -# so that the encrypted IDs generated for the app are specific to this installation. -{% if env == 'staging' %} -ID_ENCRYPTION_KEY = '6\x80\x18\xdc\xcf \xad\x14U\xa7\x05X\x7f\x81\x01\xd5\x19i\xf3S;\xcaL\xcf\xe2\x8d\x82\x1a\x12\xd9}\x8c' -{% else %} -ID_ENCRYPTION_KEY = '{{modernpaste_encryption_key}}' -{% endif %} - -# Flask session secret key -# IMPORTANT NOTE: Open up a Python terminal, and replace the below with the output of os.urandom(32) -# This secret key should be different for every installation of Modern Paste. -{% if env == 'staging' %} -FLASK_SECRET_KEY = '{{modernpaste_stg_session_key}}' -{% else %} -FLASK_SECRET_KEY = '{{modernpaste_session_key}}' -{% endif %} - -# Languages -# A list of all languages you want to support with the app. Add 'text' for plain text support. -# Only use strings from the directory app/static/build/lib/codemirror/mode -LANGUAGES = [ - 'text', - 'clike', - 'cmake', - 'css', - 'd', - 'diff', - 'dockerfile', - 'erlang', - 'go', - 'haskell', - 'htmlmixed', - 'javascript', - 'jinja2', - 'lua', - 'markdown', - 'perl', - 'php', - 'python', - 'rpm', - 'rst', - 'ruby', - 'rust', - 'shell', - 'sql', - 'swift', - 'xml', - 'yaml', -] diff --git a/roles/modernpaste/templates/flask_config.py b/roles/modernpaste/templates/flask_config.py deleted file mode 100644 index 6ae3833ec7..0000000000 --- a/roles/modernpaste/templates/flask_config.py +++ /dev/null @@ -1,13 +0,0 @@ -import config -import constants - -{% if env == 'staging' %} -SQLALCHEMY_DATABASE_URI = 'postgres://{{modernpaste_stg_db_user}}:{{modernpaste_stg_db_password}}@db01/modernpaste' -{% else %} -SQLALCHEMY_DATABASE_URI = 'postgres://{{modernpaste_db_user}}:{{modernpaste_db_password}}@db01/modernpaste' -{% endif %} - -SQLALCHEMY_TRACK_MODIFICATIONS = False - -# Flask session secret key -SECRET_KEY = config.FLASK_SECRET_KEY diff --git a/roles/modernpaste/templates/modern-paste.conf b/roles/modernpaste/templates/modern-paste.conf deleted file mode 100644 index b9c4737b45..0000000000 --- a/roles/modernpaste/templates/modern-paste.conf +++ /dev/null @@ -1,149 +0,0 @@ -WSGIDaemonProcess stickynotes2modernpaste user=apache group=apache threads=5 -WSGIScriptAlias /stickynotes2modernpaste /usr/share/stickynotes2modernpaste/stickynotes2modernpaste.wsgi -WSGISocketPrefix run/wsgi - -# Grab a cup of coffee, a light snack, and turn on some classical music. -# You're in for a bit of a novel. -# -# The below rules are worthy of some comment so that later on when I (or -# heaven forbid anyone else) have to revisit them for some horrible reason, -# they can be referred to and maybe (but unlikely) useful. -# -# Chapter 1. Background. -# -# The rewrite rules exist solely for the purpose of continuing to support old -# `fpaste` (the CLI app). This is in the process of being rewritten, and one -# day we won't have to support it anymore. But for now, we do, because it's on -# live media (and, I believe, Desktop installs, by default), and when a user is -# having issues and asking for help in IRC, they need to be able to use -# `fpaste` to do so. So, that is why we care about `fpaste` in its current -# (F25-F26) form. -# -# You see, fpaste was written in such a way that it makes a lot of weird -# assumptions that don't hold anymore. I will not speculate on why it was -# written the way it was, but I _will_ briefly outline some of the intricacies -# of supporting it. -# -# First off the workflow is something like this: -# 1. User wants to paste some text. Who knows why they want to do this. Maybe -# they are bored and want to see how broken our rewrite rules are. Maybe -# they hate me and want to see me cry trying to fix them. Who knows?! -# -# 2. The fpaste client makes a POST on their behalf to /. This POST payload -# includes the text of the paste and some other information (paste -# language, etc). -# -# 3. The server sees the POST, matches it against our rules below, and -# decides that it needs to redirect them to stickynotes2modernpaste, a -# custom Flask app that I (relrod) wrote so that we could handle requests -# that are in the form our old stickynotes pastebin accepted, and proxy -# them to modernpaste. -# -# Note that this matches the first set of crazy RewriteConds below. We -# only want to send CLI users there, and only when they POST to /. At -# this point, at least. -# -# 4. sn2mp says "okay cool," proxies the paste to modernpaste via its JSON -# API, and returns back to fpaste a JSON blob that contains JSON with two -# keys that fpaste requires exists. In our response, one of them is always -# an empty string, and the other is the id of the paste, prefixed with -# "paste/". -# -# 5. At this point, fpaste has enough information to return a URL to the -# paste. However, things are not all okay in the world. You see, fpaste -# wants to show a short-url too. Apparently people don't like typing or -# something. To generate a short-url, the fpaste client sends another POST -# to us, at the path "/paste/[the paste id]//". In the past, when it would -# do this, stickynotes would return a JSON blob that included the -# short-url. In fact, it would always include the short-url at the -# third-line from the last in its JSON response, and the fpaste client -# hardcoded that assumption. See Chapter 2 for information about the "//". -# -# 6. When we get this second POST, we again send the client to sn2mp. We add -# a few more crazy RewriteConds to ensure that we only add this behavior -# for fpaste and not most users. We know paste IDs are 22-24 characters -# long (as per https://github.com/LINKIWI/modern-paste/pull/33) and that -# the client will always POST to "/paste/[the paste id]//". So we match on -# that. If we match, sn2mp will take everything after its name and append -# it to the URL that ultimately gets shipped to da.gd for shortening. Then -# it returns a (malformed) JSON blob that is written in exactly the way -# fpaste expects. -# -# 7. Then fpaste shows the user both URLs, and all is okay. -# -# Chapter 2. Trailing slashes. -# -# The fpaste client defaults to private mode, but modernpaste doesn't support -# that, per se. You can password-protect pastes, but that's about it. -# -# However, they way stickynotes worked, it used /[paste id]/[secret] when a -# paste was private. Since modernpaste does things differently, sn2mp never -# returns the [secret] part of that URL. Or rather, it returns the empty string -# in its place. This means, by default (private mode = true), fpaste will -# both render, and internally use, a URL that has /[paste id]/[secret]. But -# since [secret] is the empty string, this is equivalent to /[paste id]/, with -# the trailing slash. -# -# To make matters worse, this little gem is found in the fpaste procedure for -# doing the second POST (#5 and 6 above): -# -# eq = urllib.request.Request(url=long_url+'/', data=params.encode()) -# -# Yep, it adds a '/' for the second POST. So we get POSTs to -# /paste/[paste id]// during the second POST. -# -# Our capture of the paste ID below (the ".{22,24}" part) will match the first -# trailing slash, but not the second (because of the /$ that comes after). -# Nevertheless sn2mp handles all three cases anyway, and will STRIP OFF -# trailing slashes if they occur 0, 1, or 2 times. -# -# Lastly, the long url that fpaste shows the user contains one trailing slash -# (due to the /[secret] part from how stickynotes worked). So we add one final -# rewrite that redirects users who go to that, to the non-slash version. -# -# If you have made it this far, you are a champion. You should get a badge. -# -# Warm regards and good luck, -# relrod - -RewriteEngine on -#LogLevel alert rewrite:trace6 - -{% if env != 'staging' %} -RewriteRule login / [L,R] -RewriteRule archive /login/ [L,R] -RewriteRule api/paste/recent /login/ [L,R] -RewriteRule api/paste/top /login/ [L,R] -{% endif %} - -RewriteCond %{HTTP_USER_AGENT} ^fpaste\/0\.3.*$ [OR] -RewriteCond %{HTTP_USER_AGENT} ^Python\-urllib.*$ -RewriteCond %{REQUEST_METHOD} POST -RewriteRule ^/$ /stickynotes2modernpaste/$1 [L,PT] - -RewriteCond %{HTTP_USER_AGENT} ^fpaste\/0\.3.*$ [OR] -RewriteCond %{HTTP_USER_AGENT} ^Python\-urllib.*$ -RewriteCond %{REQUEST_METHOD} POST -RewriteRule ^/paste/(.{22,24})/$ /stickynotes2modernpaste/paste/$1 [L,PT] - -# Otherwise, if we're given a URL with a trailing slash, kill it. -RewriteRule ^/paste/([^/]{22,24})/$ /paste/$1 [R,L] - -WSGIScriptAlias / /usr/share/modern-paste/modern_paste.wsgi - - - WSGIProcessGroup stickynotes2modernpaste - WSGIApplicationGroup %{GLOBAL} - WSGIScriptReloading On - Order deny,allow - Require all granted - - - - Require all granted - - -DocumentRoot /usr/share/modern-paste -#ErrorLog logs/modern-paste-error.log -#CustomLog logs/modern-paste-access.log combined -#LogLevel info diff --git a/roles/nagios_server/templates/nagios/services/websites.cfg.j2 b/roles/nagios_server/templates/nagios/services/websites.cfg.j2 index 1e8be53484..97000c408b 100644 --- a/roles/nagios_server/templates/nagios/services/websites.cfg.j2 +++ b/roles/nagios_server/templates/nagios/services/websites.cfg.j2 @@ -129,14 +129,6 @@ define service { use websitetemplate } -define service { - hostgroup_name proxies - service_description http-modernpaste - check_command check_website_ssl!paste.fedoraproject.org!/!LOGIN - max_check_attempts 8 - use websitetemplate -} - ## ## Individual hosts diff --git a/roles/openshift-apps/modernpaste/files/buildconfig.yml b/roles/openshift-apps/modernpaste/files/buildconfig.yml deleted file mode 100644 index 86424358b2..0000000000 --- a/roles/openshift-apps/modernpaste/files/buildconfig.yml +++ /dev/null @@ -1,34 +0,0 @@ -apiVersion: v1 -kind: BuildConfig -metadata: - name: "modernpaste-docker-build" - labels: - environment: "modernpaste" -spec: - runPolicy: Serial - source: - dockerfile: |- - FROM fedora:27 - LABEL \ - name="Modern Paste" \ - vendor="Fedora Infrastructure" \ - license="MIT" - RUN curl -o /etc/yum.repos.d/infra-stg.repo \ - https://infrastructure.fedoraproject.org/cgit/ansible.git/plain/files/common/fedora-infra-tags.repo - RUN yum -y install modern-paste - RUN yum -y install --setopt=tsflags=nodocs \ - python-gunicorn \ - python2-mock \ - python-psycopg2 - WORKDIR /usr/share/modern-paste - RUN sed -i '216,219d;228,229d' app/api/paste.py - RUN mv modern_paste.wsgi modern_paste_wsgi.py - USER 1001 - EXPOSE 8080 - ENTRYPOINT gunicorn --bind 0.0.0.0:8080 --access-logfile=- --chdir /usr/share/modern-paste modern_paste_wsgi:application - strategy: - type: Docker - output: - to: - kind: ImageStreamTag - name: inframodernpaste:latest diff --git a/roles/openshift-apps/modernpaste/files/deploymentconfig.yml b/roles/openshift-apps/modernpaste/files/deploymentconfig.yml deleted file mode 100644 index ead888db1e..0000000000 --- a/roles/openshift-apps/modernpaste/files/deploymentconfig.yml +++ /dev/null @@ -1,72 +0,0 @@ -apiVersion: v1 -kind: DeploymentConfig -metadata: - name: "modernpaste-web" - labels: - environment: "modernpaste" - service: web -spec: - replicas: 1 - selector: - environment: "modernpaste" - service: web - template: - metadata: - labels: - environment: "modernpaste" - service: web - spec: - containers: - - name: web - image: 172.30.53.136:5000/modernpaste/inframodernpaste:latest - ports: - - containerPort: 8080 - volumeMounts: - - name: config-volume - mountPath: /etc/modern-paste - readOnly: true - - name: secret-volume - mountPath: /etc/secret - readOnly: true - env: - - name: ENCRYPTION_KEY - valueFrom: - secretKeyRef: - name: "modernpaste-secret" - key: encryption-key - - name: SESSION_KEY - valueFrom: - secretKeyRef: - name: "modernpaste-secret" - key: session-key - - name: DATABASE_URI - valueFrom: - secretKeyRef: - name: "modernpaste-secret" - key: database-uri - #- name: DOMAIN - # value: ${DOMAIN} - readinessProbe: - timeoutSeconds: 1 - initialDelaySeconds: 5 - httpGet: - path: / - port: 8080 - livenessProbe: - timeoutSeconds: 1 - initialDelaySeconds: 30 - httpGet: - path: / - port: 8080 - resources: - limits: - memory: 384Mi - volumes: - - name: config-volume - configMap: - name: "modernpaste-configmap" - - name: secret-volume - secret: - secretName: "modernpaste-secret" - triggers: - - type: ConfigChange diff --git a/roles/openshift-apps/modernpaste/files/imagestream.yml b/roles/openshift-apps/modernpaste/files/imagestream.yml deleted file mode 100644 index eddd1d232c..0000000000 --- a/roles/openshift-apps/modernpaste/files/imagestream.yml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v1 -kind: ImageStream -metadata: - labels: - environment: "modernpaste" - name: "inframodernpaste" diff --git a/roles/openshift-apps/modernpaste/files/route.yml b/roles/openshift-apps/modernpaste/files/route.yml deleted file mode 100644 index 99207964e1..0000000000 --- a/roles/openshift-apps/modernpaste/files/route.yml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Route -metadata: - name: "modernpaste-web" - labels: - environment: "modernpaste" -spec: - port: - targetPort: web - to: - kind: Service - name: "modernpaste-web" - tls: - termination: edge - insecureEdgeTerminationPolicy: Redirect diff --git a/roles/openshift-apps/modernpaste/files/service.yml b/roles/openshift-apps/modernpaste/files/service.yml deleted file mode 100644 index 1f038915e7..0000000000 --- a/roles/openshift-apps/modernpaste/files/service.yml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: "modernpaste-web" - labels: - environment: "modernpaste" -spec: - selector: - environment: "modernpaste" - service: web - ports: - - name: web - port: 8080 - targetPort: 8080 diff --git a/roles/openshift-apps/modernpaste/templates/config.py b/roles/openshift-apps/modernpaste/templates/config.py deleted file mode 100644 index efd1224abc..0000000000 --- a/roles/openshift-apps/modernpaste/templates/config.py +++ /dev/null @@ -1,93 +0,0 @@ -import constants -import os - -# Domain from which you will access this app -# If running on a port other than 80, append it after a colon at the end of the domain, e.g. 'domain.com:8080' -DOMAIN = "modernpaste-web-modernpaste.app.os.stg.fedoraproject.org" - -# Use HTTPS by default? -# This is only used for deciding whether to use the http:// or https:// prefix when constructing full URLs, -# and is not related to your web server configuration. -DEFAULT_HTTPS = True - -# The type of build environment -# build_environment.DEV won't minify CSS and Closure-compile JavaScript; build_environment.PROD will. -# Dev and prod environments also use separate databases, modern_paste_dev and modern_paste, respectively. -BUILD_ENVIRONMENT = constants.build_environment.PROD - -# Option to use encrypted IDs rather than integer IDs -# Set this to True if you want paste IDs to be encrypted, e.g. displayed as h0GZ19np17iT~CtpuIH3NcnRi-rYnlYzizqToCmG3BY= -# If False, IDs will be displayed as regular, incrementing integers, e.g. 1, 2, 3, etc. -USE_ENCRYPTED_IDS = True - -# Choose to allow paste attachments -# This will allow for users to attach files and images to pastes. If disabled, the MAX_ATTACHMENT_SIZE and -# ATTACHMENTS_DIR configuration constants will be ignored. -ENABLE_PASTE_ATTACHMENTS = False - -# Allow only paste attachments below a certain size threshold, in MB -# Set this to 0 for an unlimited file size. -MAX_ATTACHMENT_SIZE = 5 - -# Location to store paste attachments -# Please use an absolute path and ensure that it is writable by www-data. -ATTACHMENTS_DIR = '/var/www/modern-paste-attachments' - -# Choose to enable or disable user registration -# If False, the web interface will not allow access to the user registration page. Additionally, the API endpoint -# for creating new users will respond with an error. -# This is useful for private or internal installations that aren't intended for public use. -ENABLE_USER_REGISTRATION = False - -# Choose to require users to be logged in to post pastes -# If True, the web interface will allow access to the paste post interface only if the user is signed in. Additionally, -# the API endpoint for creating new pastes will respond with an error if not authenticated with an API key tied to an -# existing, active user. -# This is useful for private or internal installations that aren't intended for public use. -REQUIRE_LOGIN_TO_PASTE = False - -# AES key for generating encrypted IDs -# This is only relevant if USE_ENCRYPTED_IDS above is True. If not, this config parameter can be ignored. -# It is recommended, but not strictly required, for you to replace the string below with the output of os.urandom(32), -# so that the encrypted IDs generated for the app are specific to this installation. -#ID_ENCRYPTION_KEY = os.environ.get('ENCRYPTION_KEY') -ID_ENCRYPTION_KEY = '{{modernpaste_stg_encryption_key}}' - -# Flask session secret key -# IMPORTANT NOTE: Open up a Python terminal, and replace the below with the output of os.urandom(32) -# This secret key should be different for every installation of Modern Paste. -#FLASK_SECRET_KEY = os.environ.get('SECRET_KEY') -FLASK_SECRET_KEY = '{{modernpaste_stg_session_key}}' - -# Languages -# A list of all languages you want to support with the app. Add 'text' for plain text support. -# Only use strings from the directory app/static/build/lib/codemirror/mode -LANGUAGES = [ - 'text', - 'clike', - 'cmake', - 'css', - 'd', - 'diff', - 'dockerfile', - 'erlang', - 'go', - 'haskell', - 'htmlmixed', - 'javascript', - 'jinja2', - 'lua', - 'markdown', - 'perl', - 'php', - 'python', - 'rpm', - 'rst', - 'ruby', - 'rust', - 'shell', - 'sql', - 'swift', - 'xml', - 'yaml', -] diff --git a/roles/openshift-apps/modernpaste/templates/configmap.yml b/roles/openshift-apps/modernpaste/templates/configmap.yml deleted file mode 100644 index dcc75436b5..0000000000 --- a/roles/openshift-apps/modernpaste/templates/configmap.yml +++ /dev/null @@ -1,12 +0,0 @@ -{% macro load_file(filename) %}{% include filename %}{%- endmacro -%} -apiVersion: v1 -kind: ConfigMap -metadata: - name: "modernpaste-configmap" - labels: - environment: "modernpaste" -data: - flask_config.py: |- - {{ load_file('flask_config.py') | indent }} - config.py: |- - {{ load_file('config.py') | indent }} diff --git a/roles/openshift-apps/modernpaste/templates/flask_config.py b/roles/openshift-apps/modernpaste/templates/flask_config.py deleted file mode 100644 index e32ff28956..0000000000 --- a/roles/openshift-apps/modernpaste/templates/flask_config.py +++ /dev/null @@ -1,7 +0,0 @@ -import config -import constants -import os - -SQLALCHEMY_DATABASE_URI = "postgres://{{modernpaste_stg_db_user}}:{{modernpaste_stg_db_password}}@db01.stg.phx2.fedoraproject.org/modernpaste" -SQLALCHEMY_TRACK_MODIFICATIONS = False -SECRET_KEY = config.FLASK_SECRET_KEY diff --git a/roles/openshift-apps/modernpaste/templates/secret.yml b/roles/openshift-apps/modernpaste/templates/secret.yml deleted file mode 100644 index f8859142b2..0000000000 --- a/roles/openshift-apps/modernpaste/templates/secret.yml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: "modernpaste-secret" - labels: - environment: "modernpaste" -stringData: - encryption-key: "{{modernpaste_stg_encryption_key}}" - session-key: "{{modernpaste_stg_session_key}}" - database-uri: "postgres://{{modernpaste_stg_db_user}}:{{modernpaste_stg_db_password}}@db01.stg.phx2.fedoraproject.org/modernpaste" diff --git a/roles/paste/files/class_urlshort.php b/roles/paste/files/class_urlshort.php deleted file mode 100644 index e4ba03c489..0000000000 --- a/roles/paste/files/class_urlshort.php +++ /dev/null @@ -1,40 +0,0 @@ - -* Copyright (c) 2013 Athmane Madjoudj -* All rights reserved. Do not remove this copyright notice. -*/ - -/** - * URL shortener using ur1.ca from Indenti.ca - **/ -class URLShortener -{ - public function shorten($long_url) - { - // Don't shorten private pastes. - if(preg_match('/^http(s)?:\/\/(.+).fedoraproject.org\/(\d+)\/(\d+)\/$/', $long_url)) { - return $long_url; - } - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL,"https://da.gd/s?strip"); - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('url' => $long_url))); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); - curl_setopt($ch, CURLOPT_TIMEOUT, 2); - $result = curl_exec($ch); - curl_close($ch); - if (!empty($result)) - return $result; - else - return false; - - } -} - -?> diff --git a/roles/paste/files/show.php b/roles/paste/files/show.php deleted file mode 100644 index 333150a9cb..0000000000 --- a/roles/paste/files/show.php +++ /dev/null @@ -1,279 +0,0 @@ - -* Copyright (c) 2013 Athmane Madjoudj -* All rights reserved. Do not remove this copyright notice. -*/ - -// Invoke required files -include_once('init.php'); - -// Collect some data -$paste_id = $core->variable('id', 0); -$hash = $core->variable('hash', 0); -$mode = $core->variable('mode', ''); -$project = $core->variable('project', ''); -$password = $core->variable('password', ''); -$sid = $core->variable('session_id_' . $paste_id, '', true); -$mode = strtolower($mode); - -// Password exempt -$exempt = false; - -// Trim trailing / -if (strrpos($password, '/') == strlen($password) - 1) -{ - $password = substr($password, 0, strlen($password) - 1); -} - -if (empty($mode)) -{ - $mode = $core->variable('format', ''); - $_GET['mode'] = $mode; -} - -// Check for mode validity -if ($mode && $mode != 'raw' && $mode != 'xml' && $mode != 'json') -{ - die; -} - -// Initialize the skin file -if ($mode != 'raw') -{ - $skin->init('tpl_show'); -} - -// We want paste id -if ($paste_id == 0) -{ - $core->redirect($core->path() . 'all/'); -} - -// Escape the paste id -$db->escape($paste_id); - -// Get the paste data -$sql = "SELECT * FROM {$db->prefix}main WHERE id = {$paste_id} LIMIT 1"; -$row = $db->query($sql, true); - -// Check if something was returned -if ($row == null) -{ - if ($mode == 'xml' || $mode == 'json') - { - $skin->assign('error_message', 'err_not_found'); - echo $skin->output("api_error.{$mode}"); - die; - } - else if ($mode == 'raw') - { - die($lang->get('error_404')); - } - else - { - $skin->assign(array( - 'error_text' => $lang->get('error_404'), - 'data_visibility' => 'hidden', - )); - - $skin->kill(); - } -} - -// Is it a private paste? -if ($row['private'] == "1") -{ - if (empty($hash) || $row['hash'] != $hash) - { - if ($mode == 'xml' || $mode == 'json') - { - $skin->assign('error_message', 'err_invalid_hash'); - echo $skin->output("api_error.{$mode}"); - die; - } - else if ($mode == 'raw') - { - die($lang->get('error_hash')); - } - else - { - $skin->assign(array( - 'error_text' => $lang->get('error_hash'), - 'data_visibility' => 'hidden', - )); - - $skin->kill(); - } - } -} - -// Check if password cookie is there -if (!empty($row['password']) && !empty($sid)) -{ - // Escape the session id - $db->escape($sid); - - // Clean up the session data every 30 seconds - if (time() % 30 == 0) - { - $age = time() - 1200; - $db->query("DELETE FROM {$db->prefix}session " . - "WHERE timestamp < {$age}"); - } - - $pass_data = $db->query("SELECT sid FROM {$db->prefix}session " . - "WHERE sid = '{$sid}'", true); - - if (!empty($pass_data['sid'])) - { - $exempt = true; - } -} - -// Is it password protected? -if (!empty($row['password']) && empty($password) && !$exempt) -{ - if ($mode == 'xml' || $mode == 'json') - { - $skin->assign('error_message', 'err_password_required'); - echo $skin->output("api_error.{$mode}"); - die; - } - else if ($mode == 'raw') - { - die($lang->get('err_passreqd')); - } - else - { - $skin->init('tpl_show_password'); - $skin->title("#{$row['id']} • " . $lang->get('site_title')); - $skin->output(); - - exit; - } -} - -// Check password -if (!empty($row['password']) && !empty($password) && !$exempt) -{ - $check = sha1(sha1($password) . $row['salt']); - - if ($check != $row['password']) - { - if ($mode == 'xml' || $mode == 'json') - { - $skin->assign('error_message', 'err_invalid_password'); - echo $skin->output("api_error.{$mode}"); - die; - } - else if ($mode == 'raw') - { - die($lang->get('invalid_password')); - } - else - { - $skin->assign(array( - 'error_text' => $lang->get('invalid_password'), - 'data_visibility' => 'hidden', - )); - - $skin->kill(); - } - } - else - { - // Create a session - $sid = sha1(time() . $core->remote_ip()); - - $core->set_cookie('session_id_' . $paste_id, $sid); - $db->query("INSERT INTO {$db->prefix}session " . - "(sid, timestamp) VALUES ('{$sid}', " . time() . ")"); - } -} - -// Is it raw? just dump the code then -if ($mode == 'raw') -{ - header('Content-type: text/plain; charset=UTF-8'); - header('Content-Disposition: inline; filename="pastedata"'); - - echo $row['data']; - exit; -} - -// Prepare GeSHi -$geshi = new GeSHi($row['data'], $row['language']); -$geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS, 2); -$geshi->set_header_type(GESHI_HEADER_DIV); -//$geshi->set_line_style('background: #f7f7f7; text-shadow: 0px 1px #fff; padding: 1px;', -// 'background: #fbfbfb; text-shadow: 0px 1px #fff; padding: 1px;'); -$geshi->set_overall_style('word-wrap:break-word;'); - -// Generate the data -$user = empty($row['author']) ? $lang->get('anonymous') : htmlspecialchars($row['author']); -$time = date('d M Y, h:i:s e', $row['timestamp']); -$info = $lang->get('posted_info'); - -$info = preg_replace('/\_\_user\_\_/', $user, $info); -$info = preg_replace('/\_\_time\_\_/', $time, $info); - -// Before we display, we need to escape the data from the skin/lang parsers -$code_data = (empty($mode) ? $geshi->parse_code() : htmlspecialchars($row['data'])); - -$lang->escape($code_data); -$skin->escape($code_data); - -// Fix JSON rendering. The JSON spec disallows newlines in string literals -// https://www.ietf.org/rfc/rfc4627.txt : -// "All Unicode characters may be placed within the -// quotation marks except for the characters that must be escaped: -// quotation mark, reverse solidus, and the control characters (U+0000 -// through U+001F)." -// ... and since \n is a control character, sticky-notes putting newlines in -// string literals (unescaped) breaks spec. -if ($mode && $mode == 'json') { - $code_data = str_replace("\n", "\\n", $code_data); -} - -// Shorten the current URL -$url_shortener = new URLShortener(); -$short_url = $url_shortener->shorten($nav->get_paste($row['id'], $hash, $project, true, '')); - -// Assign template variables -$skin->assign(array( - 'paste_id' => $row['id'], - 'paste_data' => $code_data, - 'paste_lang' => htmlspecialchars($row['language']), - 'paste_info' => $info, - 'paste_user' => $user, - 'paste_timestamp' => $row['timestamp'], - 'raw_url' => $nav->get_paste($row['id'], $hash, $project, false, 'raw'), - 'share_url' => urlencode($core->base_uri()), - 'share_title' => urlencode($lang->get('paste') . ' #' . $row['id']), - 'error_visibility' => 'hidden', - 'geshi_stylesheet' => $geshi->get_stylesheet(), - 'short_url' => $short_url, -)); - -// Let's output the page now -$skin->title("#{$row['id']} • " . $lang->get('site_title')); - -if ($mode == 'raw') -{ - $skin->output(false, true); -} -else if ($mode) -{ - echo $skin->output("api_show.{$mode}"); -} -else -{ - $skin->output(); -} - -?> diff --git a/roles/paste/files/skins/fedora/css/fedora.css b/roles/paste/files/skins/fedora/css/fedora.css deleted file mode 100644 index 30485864b5..0000000000 --- a/roles/paste/files/skins/fedora/css/fedora.css +++ /dev/null @@ -1,561 +0,0 @@ -/* - Fedora pastebin styling, based on Koji styling - Copyright (c) 2007,2008, 2009, 2012 Red Hat, Inc. - - Authors: - Athmane Madjoudj - - Original Authors: - Mike Bonnet - Mike McLean - Dennis Gilmore -*/ - -html { - min-width: 800px; -} - -body { - margin: 0px; - padding: 0px; - font-size: small; - font-family: "Liberation Sans","Lucida Grande", "Luxi Sans", "Bitstream Vera Sans", helvetica, verdana, arial, sans-serif; - color: #666; - background: #fff url(../images/header-bg.png) repeat-x; -} - -a, a:visited, a:hover { - color: #0066CC; - text-decoration: none; -} - -h4 -{ - font-size:19px; - margin-bottom:14px; -} - -#wrap { - min-width: 750px; - max-width:1100px; - margin-left:auto; - margin-right:auto; - padding: 0; - text-align: left; -} - -#innerwrap { -position:relative; -} - -#header { -height:87px -} - - -#fpasteLogo { - display:inline-block; - padding-top:8px; - -} - - - -div#content { - margin: 0 20px; - margin-top:30px; - clear: both; -} - -p#footer { - padding-top: 40px; - margin-left: 15px; - line-height: 1.5em; - color: #999; - font-size: xx-small; - clear: both; -} - -p#footer a { - text-decoration: none; -} - -.hide { - display: none; -} - -.disabled { - color: #808080; -} - -#mainNav { - font-size:16px; - font-weight:bold; - height: 30px; -} - -#mainNav ul { - padding: 0px; - margin: 0px; - list-style-type: none; -} - -#mainNav ul li { - - float: left; - -} - -#mainNav ul li a { - display: block; - color: rgba(255,255,255,0.8); - text-decoration: none; - padding: 0.5em 1.5em; - font-size: 0.77em; - height: 1.5em; -} - -#mainNav ul li:hover { - -webkit-border-top-left-radius: 5px; --webkit-border-top-right-radius: 5px; --moz-border-radius-topleft: 5px; --moz-border-radius-topright: 5px; -border-top-left-radius: 5px; -border-top-right-radius: 5px; -background-color:rgba(255,255,255,0.1); -} - -body#summary #mainNav li#summaryTab a, -body#tasks #mainNav li#tasksTab a, -body#tags #mainNav li#tagsTab a, -body#builds #mainNav li#buildsTab a, -body#packages #mainNav li#packagesTab a, -body#users #mainNav li#usersTab a, -body#hosts #mainNav li#hostsTab a, -body#buildtargets #mainNav li#buildtargetsTab a, -body#reports #mainNav li#reportsTab a, -body#search #mainNav li#searchTab a { - background-color: #fff; - color: #444; - -webkit-border-top-left-radius: 5px; --webkit-border-top-right-radius: 5px; --moz-border-radius-topleft: 5px; --moz-border-radius-topright: 5px; -border-top-left-radius: 5px; -border-top-right-radius: 5px; -} - -table { - border-spacing: 0px; -} - -th { - font-weight: bold; - vertical-align: text-top; - min-width: 100px; - text-align:right; -} - -td -{ - padding-left:15px; -} - -th, td { - line-height:19px; -} - -td.building { - color: #cc0; - width:45px; -} - -td.complete { - color: #0c0; - width:45px; -} - -td.deleted, -td.failed, -td.canceled { - color: #c00; - width:45px; -} - -td.false { - color: #c00; -} - -td.true { - color: #0c0; -} - -img.sort { - /* used for up/down sort arrows*/ - vertical-align: baseline; - width: 10px; - height: 9px; -} - -td.paginate { - text-align: center; -} - -form.pageJump { - float: right; - margin-left: 20px; -} - -form.pageJump select { - font-size: smaller; -} - -div.dataHeader { - font-weight: bold; - font-size:17px; - line-height:28px; - padding-bottom:4px; -} - -div.pageHeader { - margin-bottom: 10px; - font-weight: bold; - font-size: 19px; -} - -table.nested { - float: left; -} - -td.container { - /*padding: 4px 0px;*/ - width: 100%; -} - -table.nested th, -table.nested td { - padding: 2px 4px; -} - -div.toggle { - padding: 6px; -} - -td.tree { - -} - -.tree span.root { - font-weight: bold; - -} - -.tree ul { - padding-left: 2em; - list-style: none; - margin-top: 0em; - margin-bottom: 0em; -} - -.tree span.treeBranch { - border-bottom: 1px solid #000; - border-left: 1px solid #000; - font-size: 1.2em; -} - -.tree li.sibling > span.treeBranch { - border-left-width: 0em; -} - -.tree li.sibling { - border-left: 1px solid #000; -} - -.tree a { - text-decoration: none; -} - -.tree span.treeLabel { - position: relative; - top: 0.6em; - margin-left: 1.2em; - padding-left: 0.2em; - - font-size: 0.83em; -} - -.tree > ul { - padding-bottom: 0.6em; -} - -.hidden { - display: none; -} - -.tree span.treeToggle { - font-weight: bold; -} - -.tree span.treeLink { - font-size: smaller; -} - -.adminLink { - color: #000; -} - -img.stateimg { - margin-top: -6px; - margin-bottom: -6px; -} - -.charlist { - text-align: center; -} - -img.graphrow { - background-color: #00f; - vertical-align: bottom; -} - -table.data-list { - width: 100%; -} - -table.data-list td { - vertical-align: text-top; - padding-left:3px; -} - -tr.list-header { - background-color: #fff; -} - -tr.list-header th { - background-color: #eee; - box-shadow: 0 -1px 0 #ddd, 0 1px 0 #ddd; - text-align:left; - padding-left:4px; -} - -tr.list-header th { -min-width:1px; -} - -table.nested th -{ - min-width:1px; -} - -tr.row-even, -tr.row-odd -{ - box-shadow: 0 1px 0 #ddd; -} - -tr.row-even td, -tr.row-odd td -{ -padding-left:4px; -} - -tr.row-odd td:first-child, -tr.row-even td:first-child - { - box-shadow: -1px 0 0 #ddd; -} - -tr.row-odd td:last-child, -tr.row-even td:last-child { - box-shadow: 1px 0 0 #ddd; -} - -tr.list-header th:first-child -{ - box-shadow: -1px 0 0 #ddd,0 -1px 0 #ddd, 0 1px 0 #ddd; -} - -tr.list-header th:last-child -{ - box-shadow: 1px 0 0 #ddd,0 -1px 0 #ddd, 0 1px 0 #ddd; -} - -tr.row-even td.tree { - -} - -tr.row-even td.tree span.treeLabel { - -} - -.taskfree, .taskfree:visited, .taskfree:hover { - color: #3300CC; - background-color:#fff; -} -.taskopen, .taskopen:visited, .taskopen:hover { - color: #FF6600; - background-color:#fff; -} -.taskclosed, .taskclosed:visited, .taskclosed:hover { - color: #00CC00; - background-color:#fff; -} -.taskcanceled, .taskcanceled:visited, .taskcanceled:hover { - color: #CC9900; - background-color:#fff; -} -.taskassigned, .taskassigned:visited, .taskassigned:hover { - color: #CC00FF; - background-color:#fff; -} -.taskfailed, .taskfailed:visited, .taskfailed:hover { - color: #CC0000; - background-color:#fff; -} - -a.help { - text-decoration: underline; -} - -abbr { - cursor: help; -} - -.changelog { - font-family: monospace; - font-size: medium; - white-space: pre; -} - -#headerHelp { - float: right; - margin: 15px 10px 0 0; -} - -.filterlist { - font-size: smaller; -} - -span#loginInfo { - background-color: #ccc; - font-weight: bold; - padding: 3px 15px; - position: absolute; - right: 0; - top: 0; - -webkit-border-bottom-left-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - -moz-border-radius-bottomleft: 3px; - -moz-border-radius-bottomright: 3px; - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; - box-shadow: 0 10px 10px rgba(255, 255, 255, 0.5) inset, 0 1px 3px rgba(0, 0, 0, 0.5); - -mox-box-shadow: 0 10px 10px rgba(255, 255, 255, 0.5) inset, 0 1px 3px rgba(0, 0, 0, 0.5); - -webkit-box-shadow: 0 10px 10px rgba(255, 255, 255, 0.5) inset, 0 1px 3px rgba(0, 0, 0, 0.5); -} - -.smaller { - font-size: smaller; -} - -.rpmheader { - /*font-family: monospace; - font-size: medium; - white-space: pre;*/ -} - -.error { - color: red; -} - -hr { - border: 1px solid #ccc; - margin-top: 10px; -} - -#paste_data { - background: none repeat scroll 0 0 #FFFFFF; - border: 2px solid #CCCCCC; - min-height: 300px; - width: 1000px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.pre-cache { - display: none; -} - -.span6, .span6_2 { - width: 600px; - background-color: #dfe0e3; - font-weight: bold; - padding: 5px 15px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.span6_2 { - width: 730px; - padding: 10px; -} - -#paste_lang { - margin-left: 30px -} - -#paste_expire { - margin-left: 180px; -} - -#label_paste_private { - margin-left: 10px; -} - -#paste_button, .btn, .page_no { - margin-left: 60px; - background: #234f8c; - color: #fff; - border: 1px solid #234f8c; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - width: 100px; - padding: 7px; - text-transform: uppercase; - cursor: pointer; -} - -.btn, .page_no { - padding: 5px; - margin-left: 5px; - padding: 5px; - text-transform: none; -} - -.page_current { - font-weight: bold; -} - -a.btn:hover, a.btn:visited { - color: #fff; -} - -.pull-right { - float: right; -} - -.codewrap, .codewrap_small { - font-size: 12px; - color: #000; -} - -.codewrap li:hover { - background: #f0f0f0; -} - -.pasteinfo { - padding-bottom: 50px; -} diff --git a/roles/paste/files/skins/fedora/css/index.html b/roles/paste/files/skins/fedora/css/index.html deleted file mode 100644 index 8d1c8b69c3..0000000000 --- a/roles/paste/files/skins/fedora/css/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/roles/paste/files/skins/fedora/html/index.html b/roles/paste/files/skins/fedora/html/index.html deleted file mode 100644 index 8d1c8b69c3..0000000000 --- a/roles/paste/files/skins/fedora/html/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/roles/paste/files/skins/fedora/html/tpl_create.html b/roles/paste/files/skins/fedora/html/tpl_create.html deleted file mode 100644 index 5fccbd644d..0000000000 --- a/roles/paste/files/skins/fedora/html/tpl_create.html +++ /dev/null @@ -1,46 +0,0 @@ -
-
- - -
{{author_numeric}}
- - - - -
-
-
- -
-
- -
-
-
- -
-
- - - - - - -   - - -
-
diff --git a/roles/paste/files/skins/fedora/html/tpl_doc_about.html b/roles/paste/files/skins/fedora/html/tpl_doc_about.html deleted file mode 100644 index 7e7fe70e44..0000000000 --- a/roles/paste/files/skins/fedora/html/tpl_doc_about.html +++ /dev/null @@ -1,43 +0,0 @@ -

- - {{site_name}} • {{about}} -

-
- -{{powered_by}} -

-
-
- -
- -
-
    -
  • - {{build}} [[site_build]] -
  • -
  • - {{theme_name}} [[skin_name]] -
  • -
  • -
  • -
-
-
\ No newline at end of file diff --git a/roles/paste/files/skins/fedora/html/tpl_doc_api.html b/roles/paste/files/skins/fedora/html/tpl_doc_api.html deleted file mode 100644 index 9170022fab..0000000000 --- a/roles/paste/files/skins/fedora/html/tpl_doc_api.html +++ /dev/null @@ -1,145 +0,0 @@ -

- - {{site_name}} • {{api}} -

-
- -
-
-
- -
{{xml_caption}}
-
-
-
-
- -
{{json_caption}}
-
-
-
-
- -
- {{doc_api_para1}} - - {{doc_api_para2}} -
- {{doc_api_para3}} -
- -

{{api}} → {{create}}

- {{doc_api_para4}} -

- -

{{mandatory_params}}

-
    -
  • paste_data - {{paste_text}}
  • -
  • paste_lang - {{paste_language}}
  • -
  • api_submit - {{set_this_value}}
  • -
  • mode - {{mode_xml_json}}
  • -
- -

{{optional_params}}

-
    -
  • paste_user - {{paste_author}}
  • -
  • paste_password - {{paste_pwd}}
  • -
  • paste_private - {{paste_pvt}}
  • -
  • paste_expire - {{paste_exptime}}
  • -
  • paste_project - {{paste_proj}}
  • -
- {{language_list_exp}} -

- -

{{return_success}}

-
    -
  • id - {{id_of_paste}}
  • -
  • hash - {{hash_of_paste}}
  • -
- {{url_format_exp}} -

- -

{{return_error}}

- {{error_ret_exp}} -
    -
  • err_nothing_to_do - {{err_ntd}}
  • -
  • err_author_numeric - {{err_anum}}
  • -
  • err_save_error - {{err_save}}
  • -
  • err_spamguard_ipban - {{err_sg_ipban}}
  • -
  • err_spamguard_stealth - {{err_sg_stealth}}
  • -
  • err_spamguard_noflood - {{err_sg_noflood}}
  • -
  • err_spamguard_php - {{err_sg_php}}
  • -
-
- -

{{api}} → {{show}}

- {{doc_api_para5}} -

- - {{doc_api_para6}}
- {{doc_api_para7}} -

- -

{{mandatory_params}}

-
    -
  • id - {{id_of_paste}}
  • -
  • format - {{result_format_exp}}
  • -
- -

{{optional_params}}

-
    -
  • hash - {{hash_of_paste}}
  • -
  • password - {{password_of_paste}}
  • -
- -

{{return_success}}

-
    -
  • id - {{id_of_paste}}
  • -
  • author - {{paste_author_exp}}
  • -
  • timestamp - {{paste_timestamp}}
  • -
  • language - {{paste_lang_exp}}
  • -
  • data - {{paste_text_exp}}
  • -
- -

{{return_error}}

- {{error_ret_exp}} -
    -
  • err_not_found - {{err_404}}
  • -
  • err_invalid_hash - {{err_invhash}}
  • -
  • err_password_required - {{err_passreqd}}
  • -
  • err_invalid_password - {{err_passwrng}}
  • -
-
- -

{{api}} → {{list}}

- {{doc_api_para8}} -

- -

{{mandatory_params}}

-
    -
  • format - {{result_format_exp}}
  • -
- -

{{optional_params}}

-
    -
  • project - {{paste_proj_exp}}
  • -
  • page - {{paste_page}}
  • -
- -

{{return_success}}

-
    -
  • pastes - {{paste_list_exp}}
  • -
  • count - {{paste_count}}
  • -
  • pages - {{paste_pages}}
  • -
- -

{{return_error}}

- {{error_ret_exp}} -
    -
  • err_no_pastes - {{err_nopastes}}
  • -
-
\ No newline at end of file diff --git a/roles/paste/files/skins/fedora/html/tpl_doc_help.html b/roles/paste/files/skins/fedora/html/tpl_doc_help.html deleted file mode 100644 index daee7643f3..0000000000 --- a/roles/paste/files/skins/fedora/html/tpl_doc_help.html +++ /dev/null @@ -1,82 +0,0 @@ -

- - {{site_name}} • {{help}} -

-
- - - -
-

{{create_new_paste}}

-
- {{doc_help_para1}} -
-
- -

{{marking_private}}

-
- {{doc_help_para2}} -
-
- -

{{password_protection}}

-
- {{doc_help_para3}} -
-
- -

{{view_a_paste}}

-
- {{doc_help_para4}} -
-
- -

{{copying_code}}

-
- {{doc_help_para5}} -
-
- -

{{paste_archive}}

-
- {{doc_help_para6}} -
-
- -

{{rss_feed}}

-
- {{doc_help_para7}} -
-
- -

{{pastebin_projects}}

-
- {{doc_help_para8}} -
-
\ No newline at end of file diff --git a/roles/paste/files/skins/fedora/html/tpl_footer.html b/roles/paste/files/skins/fedora/html/tpl_footer.html deleted file mode 100644 index 63bc101700..0000000000 --- a/roles/paste/files/skins/fedora/html/tpl_footer.html +++ /dev/null @@ -1,20 +0,0 @@ - - -

-
{{site_copyright}}
- -
- -
- - - - - - diff --git a/roles/paste/files/skins/fedora/html/tpl_header.html b/roles/paste/files/skins/fedora/html/tpl_header.html deleted file mode 100644 index 36b518f2e9..0000000000 --- a/roles/paste/files/skins/fedora/html/tpl_header.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - [[page_title]] - - - - - - - - - - - - - - -
-
- - - - - - - -
-
- × - [[message_text]] -
- - -
-
diff --git a/roles/paste/files/skins/fedora/html/tpl_languages.html b/roles/paste/files/skins/fedora/html/tpl_languages.html deleted file mode 100644 index 5fd1faf0f3..0000000000 --- a/roles/paste/files/skins/fedora/html/tpl_languages.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/roles/paste/files/skins/fedora/html/tpl_list.html b/roles/paste/files/skins/fedora/html/tpl_list.html deleted file mode 100644 index 8ffe3691f7..0000000000 --- a/roles/paste/files/skins/fedora/html/tpl_list.html +++ /dev/null @@ -1,22 +0,0 @@ - - -

- - {{archives}} -

- -
- -
- [[list_data]] -
- -
-

[[error_text]]

-
- - \ No newline at end of file diff --git a/roles/paste/files/skins/fedora/html/tpl_list_item.html b/roles/paste/files/skins/fedora/html/tpl_list_item.html deleted file mode 100644 index f40be96ad2..0000000000 --- a/roles/paste/files/skins/fedora/html/tpl_list_item.html +++ /dev/null @@ -1,19 +0,0 @@ -
-
-
- - {{paste}} #[[paste_id]] - -
-
- [[paste_data]] -
-
- -
[[paste_info]]
-
{{language}}: [[paste_lang]]
-
-
-
\ No newline at end of file diff --git a/roles/paste/files/skins/fedora/html/tpl_show.html b/roles/paste/files/skins/fedora/html/tpl_show.html deleted file mode 100644 index aa1ff60687..0000000000 --- a/roles/paste/files/skins/fedora/html/tpl_show.html +++ /dev/null @@ -1,27 +0,0 @@ -
-
- - -
- Shortened URL: [[short_url]] -
- -
-
- [[paste_data]] -
-
- -
[[paste_info]]
-
{{language}}: [[paste_lang]]
-
-
- -
-
-

[[error_text]]

-
-
diff --git a/roles/paste/files/skins/fedora/html/tpl_show_password.html b/roles/paste/files/skins/fedora/html/tpl_show_password.html deleted file mode 100644 index be78f8d2fa..0000000000 --- a/roles/paste/files/skins/fedora/html/tpl_show_password.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

{{pass_protect}}

-
-
- -
- - - - -
-

- -
diff --git a/roles/paste/files/skins/fedora/images/about.png b/roles/paste/files/skins/fedora/images/about.png deleted file mode 100644 index 3b4cd6102b90e29a48f103c1a62115375b65dfd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmV+b0ssDqP)!!fui-1&RLm? zyf791C4CdLRV+zZX(5reuH0z}xRvfjUh*ii$zx?^xO|e$WX*{ZbJExMBQj?YVRcCa zGt?4*AVQk`L>`6+`{V?3IWEd1Ss+mi3Ku{E5~7j$vtA$qe~LZ@A|#>$5n*|s6V2>~ z?U1CFIj4>wD@Y_Gcc>mn#AVk+$;DT4l~+Gb>YrO>56CYB9O2HjfE<|s0000}_Mm@s@-Cmjv!d$Yj%htoGg~ zo7=ndXn^%N!vk=FAJ*(O9nSE4x>(aMkHc7~!5MDW>Wg;SpEJxUaEA3b!+MbN_-SVc^Bup3C{XGRhr(aB%Ab-`Jl300001{uRa3-c8dotbV}IBWtUmvaK(4xlCj4ROJmt+-K&$o&2DfLqL6hc~!gn zwCUl~a_+ft8YUNeF4U;KmSJ)`bH&9M-=}O~GnrM+-kWB99wg?t_$Hs!*?2~&v%4p6 zcLQ_EE@W(by!2nF!qjhTGuLZ0Uw!d^#(sHUrJ5JM&zP@H)$qSIbrFxt`pI9OX)AW7 zd&|0<3}s*G{JZLQVy^4S(CC$G-QI^U*HOD(9F{h{sI0x@qtsiITVDgJTg!rW@A;A= z^x1On+{M}N)s|kF>cZ8lw^Yy6>dwlGr!BhQ^ZP3K*xcT>G`n}5bf(F!yk-1B_MJ9< SZo7m)Vdv@U=d#Wzp$PyPca>8B diff --git a/roles/paste/files/skins/fedora/images/checkmark.png b/roles/paste/files/skins/fedora/images/checkmark.png deleted file mode 100644 index 7af1470ff230fc79b956883d21cd68835ac89e6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmV!C;-}s>~0>3>$v~`002ovPDHLkV1ldWQIr4x diff --git a/roles/paste/files/skins/fedora/images/delicious.png b/roles/paste/files/skins/fedora/images/delicious.png deleted file mode 100644 index f6f2422e3c5c6b40a3cc1d720302bd46154635cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?Pe~P)loZfCL2v9SxQu@!^6HXMOhh_Jf(d6NGTL(&){s z@4b1Rxl5kCczH0*cV|13Nud((NsuHGO@8!V!FtaTP`MBhT&K>>N8TUOG|y*G9zQDb zn>&bU?ijBZWyVmKJ!d}$(CDe0~vDy~n@4A$0T zT{}jO+GEN2y)4CA>w?DPF{-+bO@$C3WU(n1fZ>iJP%^ISfRY6a*KdDSa9V-T9w8@6 z$SUU10p~YJq3alSLmHqE`pJ@yQjOlj&#{BhOBNhx)yuC%AUfzF3*Oxw#?{H>w=ztQ z$~kPg{#*`_+<)*e+$oB<0ZLP(Z4gn!S0^X%+{N?mW5hhf_vFpH51?wZLEuYkZKusH zvgD+7gCY?BPrJ(h1Ukr)iv#C*6IInXD9aLAmURnUBL_yAkKECwbzsb8#OoqmWXUye z$GhmDf^0&D)+N$KPWjou_hw~4wYBr_iyy`9z5PGazZ#Qq78}U>A}FbJKKr)7^5SBi zq{Gnx|1u-u4}<=$kXn3t{QO^mra-web91>o{4Kx$)wN8GewUjE00000NkvXXu0mjf Dm?s81 diff --git a/roles/paste/files/skins/fedora/images/digg.png b/roles/paste/files/skins/fedora/images/digg.png deleted file mode 100644 index 044b1ae0082e4b972dfc5302bd4e046487e75ede..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 747 zcmVw&x)ewh)S-^Wdg#(2qN0!_1(h_-cIgj@ zZs_jL|KH5^-kTIpfe(iHz4^WOec$^t#{GwnJJaD8*<%U zS##@_P3y_Wd~wNq`|f?tNY>VwDvU7ubN;^xqaQzD$M$V%gZ{qL zs86S{Tq@)F&`XSc8b-&y{Q?*fi0wG=Tu*Ww$A+!~1*HhY_i*CaQArMzLefZ}J9_|D zX&Hqt6R>O>A(45WCtxnUZO4TkgbJiyKy*!84RDC1AyW^}_i^Urabk1e)7ho(uEfM~ zMo4Uo?0T_8N96gWD1cAu913EyDivJ2bq5jE&T-r`F2PU)z~+)1?gyiCeet72kwbTv zE)2+-$s(E>wGqQ3qpTo=h8XSYjoYXadK3{$H4-L8Ko6cg#rd;+D3c1$^96(@q-$$p z1q{&Db7Xbq&mIlpRR6hEe`;(5A%iJyco6qX*F~j_Q6ooC*VtO010(WzVq6yA8HOR# z(nFepuEhyIzRh56Vhq{rL3y(u{@W8~=Y$uzAvyCRaia~ckr$(e=3e@UswwU05XJ+m@9NW%oSFYdejG*VLnr=={j!SJT#*Dl6c3^s9oSLS|!pQ>gT^Q!+ dzW1*H0|2^2%?bcxs!jj^002ovPDHLkV1k3qTH62s diff --git a/roles/paste/files/skins/fedora/images/facebook.png b/roles/paste/files/skins/fedora/images/facebook.png deleted file mode 100644 index a0181d640f2d1e32423de0a90475617febf04056..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 533 zcmV+w0_y#VP)__ndp?G9yiD>O9E3Xdjf-sECw&GfMrPxq&^678ak=fVHtZ@aILGT z4V-GHT1+qRdrr0&z0PX~zH^u3a#7_u0w)%Heij;bv>ngM?{gkjz~!RuSR4|`QONf+ z79drDcyipAPej9DxB`x412sz!1PX6o_TNuKyhmn!nLoMi5EdLpI3Of3fUJhod+Ys0`;>CUtX5D!Odd&TYv!o XT!ht=EY#<000000NkvXXu0mjfRJ!6^ diff --git a/roles/paste/files/skins/fedora/images/favicon.ico b/roles/paste/files/skins/fedora/images/favicon.ico deleted file mode 100644 index 79d0ba93b698262dd52bd6c05535735dff863e5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3638 zcmeHKdsIzn8~^Q7opQRII+KrRFh_DKnuM2#BIHt06H-l6N|J6Wij%HLxlSe|)tNdq zjigNOF_l~B=8}C}jxe7~b}^AiW1Lz0oEqP8^`S(N24D(c*f5n{tOab>07L*-3G1eyr6lbsmF80@6bjVEj>p}~0tAmY!0w>A z=zJPj>5;aw-*D?WTW)n|OhXZ$~b_cwIew0S&^ z7GF4W1^4qs8U&xm+!l zQ0MVln!k@J+2x@ zU74{ef~%*ct}IDcrC=9VRtTu(;Ayb+Ch`Gj0#H*n%KwT)3aDm>8qmR4^;x#Z+W$wN zO=Q#f2e5ti&U$OCp1{M6V-n=Whhw@9kn1-F-4E(;bMJCgNOqvLJQ?xMqj2*|H4cjx zV3CPFGMx=k6=H^$FPArR-{a%a^yCLu&t%e6% zX5rTudsOd^MQihU#5)Xxi!qS9)*Cw)nV~FbEdG4+JMQI2;mVqEcqYG&fbjw}CfFm- zLx{piCsgNdL`iBWUOv8q)NcqLTseUV2Mb&}n2CMM9pEtnDA=?XS1U_Uo3;eD93XAB zA%2ec#ogj~R0N7}ws0Go^5YRXsXr?ABq3(zaICb}LUj~D=k2q|bQ^-g?J4-lXC!<~ zc{sb(A6=atST|K4-S6HY!*4RW+wNnIA@J_iGu%C%js20XD9cKPkEH01Jlzvc_6uyAHt400$JOM}oOshcJiXxV_mCg&V{1;e9t=Jfv}1Yzt|O2gH*! zacW-@err4fMOQ0)L=@5%TVu~c6Nnv6P@IvBGhtuDQ>20B+S51}IR;zZ%#h|e8QH5n zuw$+vlHILPx^x7})5GCms*M#kUtmwrY~&{fBf?IIYZckJTC@Qd@{%D??!XsGg=SJ#_A&4hL7xpUm?&+3+Z!>(9_wDS^9wMFu+g5 zMOpS1)W%N4Dx!^3d&PMFz6V_|+wkOCHQa}(BXsfrY;qicU-oT6qj&-;R#>57vpcr= z+M#5749YeKBP-kuUG0zHY6Q3#sl#(Pux_phyA}*WzSswUzI%-a^_B3m<|Agh5#GJ+ z#1a!tc!&guw-+GE)e;rUEsz!Ng1lAEcyhY|P6L6J<8-jvwm())9gOllDQH+@h3g5n z$ndvA?dox;im-B1-5)U1$#rBkQe8R+~|d9zjqbBW`K{i05P`uh?r!Al~V>|`@Dhw z&<#EX-DBM5W!`RXUgO2kG$FJw$36C=NLm?lM)S&}>C+z^^E_KA7x#!OC2?=I^$F<8 z+xj;R?W;?w@_lx?x0DiwAxvA&^Ojx#QBzD^ylUhuilV4HFD~y$k`jhUH!NuR|2`zngG1xr&N@R8!CLgb=YQKCXq>d4KR7I!a(ZR%8m!`pSij7!(RjW8>cw zVSNGJ^&-D@VNHRMrrB*Ev^>Y%64U004nMv~XJ&Hco9)~L2}zR*>V-lnO&D6}<(ZD> zS_Wk{QX{S*)oO@TAJ+uJMQLeU44f>XrNmeUni!Y;X0UqCFoDy#s;C3!N=lpr!=_mHPW@3r6EOiHWXA8Q zj-HXT7f!UITy)EKB_xFD&AcYMq-bC&X%I1CWU_3pnhPI(wSL0pzvz#auSO+`Ixm&U z2o2K1&{C;T==y`aOT9|)kWAth)Qg?-0y`7^jcFRRm@Sp2<*v+;7p8(&x41%@mdY+> z-3;_MCNzYVgkcYa7G{SAmyapepV(#3f<6VJ2}23`^+&GJU$+*7q-pvj@*6RQr?{d+LK zrfI{7&cl~hv^jJEwzYpIsRZXw$1b3#Z_D>Ze*LeC>jsX+GUW|B63@t$=PmR)zH~uV zRQ`$RgWvRdQwUVoAnO&aqpf`6t!-^y!E@qamRc4oQ5{llT&K$ZMQbs z?Zm;1@r`p2b@x3*UySz1kqZe!>g8LFhCdo~^lg{lv@z~K_lD!;&}|Mmw-|;Ygvs{G zF>h(fxz)6$FItK2%W;xQaZgWWu>9oR;2BMa`eOSK>z}I98k8at nPyk2(Uk44ofy`glX=O&z`&N| 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 diff --git a/roles/paste/files/skins/fedora/images/header-bg.png b/roles/paste/files/skins/fedora/images/header-bg.png deleted file mode 100644 index f4c540a83039b58d9ea9634252fb92661bc7e2e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmVrbZ$&K_L;DnUkR>i0!O}v`Av8lT?Zo;nJRTdNyex zoRf`N7$+>uj&k-VB!*OBt=!BN*g6q{-WT57#ObD|vw)xyEV_LQ5BMIGO!ix?nML zei5wURxJpj+K(}8xT*FFMKC6;p~GWh$lx0?%11v=#y_`)Js>}u^~aoj&2%aN0000< KMNUMnLSTZllz{dC diff --git a/roles/paste/files/skins/fedora/images/identi.png b/roles/paste/files/skins/fedora/images/identi.png deleted file mode 100644 index df91b2b0d855d74a6fd2531a8dc8a6e7af6381f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 672 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 DS+!@b diff --git a/roles/paste/files/skins/fedora/images/list.png b/roles/paste/files/skins/fedora/images/list.png deleted file mode 100644 index 8906921efe41b24be82bdf48ba509ecb25c270cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117 zcmV-*0E+*KP)4C%kn`*)K_ zK8>Mky9w^2!(dbl*oG*fu?2hi{As$HtvtSdT7cj0M>?Ix-5Zy1X!s16h9p6hVYl1i^?GTM<>CSqmKBKtaT5hgxfu!?ck(#kK7t3=LWoAARDpG`4GPPM zq>4m3HKc!ib)^JDw~59*mR@*HoJArzjk2W1p#K~cRyB70j;zH`SoYYU)@U*PJdOhC zTv=V&phn+qBwhPqJ9wDHCM;&Au=KeEwvd^Gb6+nW5_ufQ!Q=7Z)Zi!_4#$Q9sZk{LIvs++AXWR~Spv+5+#Gy9A3ab^{FsF-RLDB>r+`p~ zIG?31Ef?sXGD?MIWikQBerGdTJ9-gPsR-8LYVI*+EA&^R&6qx{9Tq4od5vuTQ7n$C zP-`aq4ga>b-Tl<*J&@dqSFfS4tZ7%@P$st+>3I3JrSCkOoy#liF98Msls6M{w`C2h P00000NkvXXu0mjfLJc&j diff --git a/roles/paste/files/skins/fedora/images/stumbleupon.png b/roles/paste/files/skins/fedora/images/stumbleupon.png deleted file mode 100644 index 0139c191aa8b4ee9d2d3d3c0b1fb4e1df2624f25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 777 zcmV+k1NQuhP)eRZ(bp^6h!$d z5UUU&WdTCaCg8>hEL=cTOf)fWT)7Zq;vX>n1rsAnqbnpeZv0@OiHVZ95RG3!Vk1pM zQW2$;()TsqnJF|zC!P1EZ|0mi_uP9~!}VleeTb!^Ar@y0P?PJ0#O{y`Qc48$>EWe0 z+Uw zoOg40yz~J=0K$SM(qs%87zAc|J}}yU4zE`WSSv_)!itNC&G2nw30(LfJZzfk&6Nt6 zn*$0#fj!SCDtG~2{3wE13_=|O_w~)g2glJ^+guJs5dcMZ6K^t4kS`W?L*m5lmqQf{ zM()(WWgI_r8vh%K=3(4fxJGJ>FUn*=Ajhbcnz6mUQ*R!-`vsZp0L->fS7YPeXbg#l zepuR@a%PA?VU&8Vf>ewTYeYJpo85UsKhCIYo5#=0kPG|>r1mMBh%a8(4YwO#t)?=2V7=X!nN@D1$TpZQfn z4O0Y^y|JDN9O>=-$NAaM>zMtxrf(Z<3nSTPNEg0u;K92bI!KLAmC2$PXXJQaKVIca z2$A!Q?3Su1Eb^Bd&5Xiq3kz%(Tx@JPa9khB+7O;DE|LdSUcxJ(fnxee8@8$|)iqWn zGfI25=ukKTT$<{v?a_b7r2=%kbSAeNA8d`muC5^k+|)6z5NPuQ(-g`$cY7OOvsrN0 zOAFPK@6*}T+m+S0ss~dOe|O_NWQRYG;4)j{pMzn5+$eoXDjK00000NkvXX Hu0mjf9Fkco diff --git a/roles/paste/files/skins/fedora/images/technorati.png b/roles/paste/files/skins/fedora/images/technorati.png deleted file mode 100644 index 7e25e96ff155dedcf0f90bc9e4909d6f0de7901c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmV;=0xI9ZPBe)+Sl^j5T-Qm<&6>|BmA_&t z^A=aT?;;=vMZkP+3HPTTB41iXi^|2_t|_6!bqt-qhEvTQVBiK*{S2A!AK`flVxdkE zm^TZ!^XfK^uvx_Q4XFN2f!2l`TGd4iPYhwZT!iD=kR1mwZH`bVT5o&i^9*!ljR*k8 zkq*tS5Kc#2JpJ^92&^hW1+M!uNL4(@sNVn1B1buvw`?%m@kHQ!cB%f@)82=u)`5NU zU!h1EE+nqNrVf}zmAT7cT18CEP1H#Sdq;4ltxt?_5bvCAwaXz!MKf`1l_cnBDz`mo)0Tg-NUy_8@b&(m?=jZR1{5Gg#hO z#Q4-0mU4^eh*T?A{E}6G;sd($7$mA$Cva-t7^dZnzaGW2*~g?x8jEDGkbN)SDt=I@ z=|KuW9C_;zUs9nGe~Vk!*<}(HO_S zSl%pQHoFGL;u%RFOeK9jmL?eZ4|83fA@u(cU;wu16Ixb_-%$Vn002ovPDHLkV1ift BOgsPp diff --git a/roles/paste/files/skins/fedora/images/xml.png b/roles/paste/files/skins/fedora/images/xml.png deleted file mode 100644 index 09279e032747abff2b03d4ee7b292b4e90aa0073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11737 zcmZv?Wl&tf*04LcTW}p*6Wl^zaCZp=_uvizf(-5wECdJ)8eD?=;7$lmLSS(B2{PE+ z$~oWr-Fk1`+O_xYAN{X;t$xz}!vg>S)V_-EeC0jd-0adP zBS2L_)*#^bX+F$nTkQi3x{+GF=~I>72-yva4cp_+4jlu3^8RX`&8w&)?*rW8UcOeZ zy7A&+OAq7xek1L93UYgE*7Sl2U*GG*4jCyqwDgBMyl{Psa`cC#jE>{R9ST(TVmV2e zW%{f3+iX_R&WFM-FVB17Mdd5W)C-l4t}e7eetaM4%yvAg80&YNLimIHH5b$|)>MXf z_=EgY`z06C+kz9jf)@BE%HFj4__QJm&eqQO0zEUoW0OnIe%y@{-n7GggkzA8Tr?w1 zCImAQwkm^|1&hur)bEum{#25O_Hya==)PHPMf%>6j20 zJLsWhdB$-kn_P;RN+vqJZiN7esx28>2HLRrJd;Seb&uyOZ*@?xwnc{*|{) zNvVKh#w>}76fqB^(`79G0ak_Hp;J=5Y*-b50wovUku(fnW;Q&YBB{+CWBXgoGAT+z zQ~95K_$IViAVc@H4lE?c6Lsry0D&~f_-n* zBSz*tm^)KQAN1DWpmiRh>Giyd>5ObK{6ga~$dGhj`%H(9S{Qaz`D1~-Zx`k3?PH8* zU@#uln&%^ZdkB4*SC#)#3v_AV9SC%MU+&1TKm#3YxKuCo8)|&EbVW*UAG9%W+5%ny zVbeQ!Mg%R862k|!m_ZmT{1k0;*@r$r;ldotM|QJmCwwech_bK%L*iF5gzqXsfJ}_y z@uN=dmp2#j8?OoXq^K8y&>U{jeFNKb2KZEEju{Jpa)vsc`R?M~v@C8mBQbVx3O67f;?hpSS`F{!Zx z7hwEJ?C&=|(!x*fBnY`r9u??eCfN!xxN<$(6x5}tzIWWFw~BaCOT+0O66f<78-4T1 zo`B>2^to#|%-hT8*XMD;+3%aE{f=pz`rSxK(#o8o?!k%2o*}ps8(0yK%l(QY^)`sQ zu8{N=aMC305fM59I=V~0Omwv9m;QikV6<&}mj5P64NX|}H-o%1=h!f^Q@A>$8DB%@ zRd!*+{31lZ;xTjXAjM05rG_w9uzrnr?sO!%hPf_6n|>uJsI#AI9yN)DFn44>_BcJL z&sAL-FH1N5O0p0EGd4f-nljK_!)nfvzfQpVq=z@i6qA+UV6n7%Q)IY_*PdlY5^xLg z5xCvO4{E}@+70a&k9bVn61dpO41w;_dHo?l9A1alur+!}NjKixi{@d>2$L9hzBsPj ztNyhFzq2i!C<&$2jCB%yL#62NQ zHpYEz!*03%4+d(JxnlKUpAgE);`d{8icDXkb=n!fhM+4TlM#}J5_+fYIH0JF1pnki z;{PxM%)_iDpEy>6z~S>6pL0=PrM%J} ziX81TW91=3X$O&;)Nl6yt^AO0=jyS*gxg2>gNMM)Qc&zMsloP)*M_(!;3O3O&?o%P zV-;M_`q?7o{#m5%_834vP-6Qtn6MCw8K-v}bg`q_5d$iH^4n%Hyd}C|8EKQo=y?!5 zgRRwJ&Y=iEGfiKa8kPC-_3w9Ak$TP;fK3ngktr8Z8E=UhC!5Q4gC@T+7)40n>s;VdHw9_9z>)+rwi;xVa-2EM`xkn3!d#Xhff*IVJ*U)-2 zE{H247(mCcuH6Kb1i^~R9^KAXg~DgLh1Ls^M6^1XNS@l;_a%BDC+?<8hIa1p>z#qP=$wx*>z@;&8@!h zZAo5xqy^|v7wba$ycuv6g%DzJ3`>cHgNu#}Yn@7~9(Vi38{SLm)zJy(80`KJK%!S}jiHwU~ z9ml+K(yoaLy@aD|(x=;Q)I2u<>+-$i+fAxSvMdkkanM55Gi3Tqg$g>+x^^#8dB^k@ zUe5s2+?j0Sn;Z_3I?tn9=5V$TIUt*vp?X+F@;yWRn~H>k{WJP2bY zKg!;LUk4?ovZ!ibUI7=&-kU6RT%XD(873uGqulb)~r@>a#G05w$xAGJD{b= zZKjD0jZmXzWZE#|=8R(qEn<6bwK2x>JwzTx1TL+SF=@w`B{=n@6OsuPm23`Ca06jCp_R~Q( zVkeMb#6U-vU9hg!5q_<3z^>o~>&BGR?wvcUW!+PJ-FDnFJ{W2FJl%6``98_VHm|@| z@vPAm){~mYio_?IDH0*_2oF^SjY>)35hV|m+Y90gxjxeEr88@nr>aNei z+>-DVo}Un4U!31qH~rx*$PXA#sA;ZWTWsRypnZv-^l(!7+9mI^TA6ZnUve4I`5Jmf?Sm;45Q7h7=@iE0jY^`n@u-cqIc zxwX!UMnYfFQ+>@T67-PAO?}12{H`^e|pe1|7YDw+TzH|yQm>})w%aKmQ& zIv2u##hs-B4S=}FEoomnC>uzCSburgdqOsiGi(ee>W{IUZ|r!TSPDU zqV^}&x{zZg|0F{_FlHPdee-0x0yrsA#BkF_8N(&R5ZByqQ(~;fn1OEw#qVkrU_U?o zf$g!+T_Ilo+D>3Xzv#|R_%dHN;5vB#4M{ARBF(b?qHVXi8cE3sZIAf4Emh-J@7TcX za(9HC&T4(`+c@yWy@)H~B5Egym?7F7-Z$~hOwa_tSOS)hCt?6h*{TGUe+k~{|MK-r zHl3BuoXJe{-A}TDQvAVS=6{QLxuq7pzgEb{=YRc2dx!^EKulaT8L8KMwxy|Mg8jta zX297#koFOWN#PUk;=Aty3>%87!)3&dDSBrVt4dz1+O!Ul)wLdqpR-))AI7B=@_x>) zE9^AB7>JzVSP;aAtCICf^;P2Zfs&!0jd`i`eI^N?*~--qNmv}pI7@Lq|hLJKmxlgc+KVb zohuMeQ0RZ+V;v1-5^hcPpBTd*#QhgOf!>lwpY)=Ur9=Os=zqnMdEb906|ip;I=2vx z{2|4MZ{orjx>ZsP0|YiKg6T{M^GyhnH+|9U->sT3rMwYYFkFzP7ajQMQsFnkWB+mj zDC+EmXt`}j=ZYB=C}fa*ihCO5hm;Ly6KcaZ0vX&FcnE#&(&95+3_UP8BD9t;N^w$i zFxC1uv|}A>bff02(em|lw76BH)fxprYFbRM{B%m;vB`vLorGluCILA~sWlDV;XQCn ziEX!Y=_=PaAJg!47v><(+rew1!QfV0sL0jE+TV_SP)>Dm%m_l5{E|m6%(94Cm6IN7 z;cmR_Tyc6FkO9(^U*Z=q(3r{Q(KXHs<0aa7`8wKGvNzh@cT=2@ZnR(4a`ZI7tYU!= zdP}J#{FWeMagAUSSXj=(nI#HE*7zZ5bRNVJzbAVb8S21Pdrcn>Sx13bOV64R7T;ie zMa$!)ZG90wLb`SfH74bK1fS!CfJ6(S`=Gb)TR9GTtwi)aEXqr+(zIjt+7*?l&Gt#O zwM^DN{|sc#g(UFHI&Tee%^B~Xi0w4V<$f~-wHw@WCA{p|JQ%Xr4=IJdYw?a~MH(NT z!}Ca?RHW{}3Taf|-wYOWQ~;gxOKwf8TH%yu(f=#MxFq!gCFpEw4)_PWf4CE6bUU4N zc+z2Yafp4l!6!3CJ3k*+F_WHO<+5TZG6;$J?T@zdzH3EMkiJ;=SZ1!X|H&-?Ij&|q z+X?P|8syhj+AKGhWEnG}3%i#6B%0?nL1wW!m>0U$hCGP2S4)Xju$D$^6&Mf%?h z9J#Foe$V{4)!3n-NYmuYS@nHG9YRQ3Au=M~h@A~fJUs_X3|)v6GQ6*S7@d{Ihbxdj zZzzgx#0LiB>wnH}4+imXEoKwqOwnU$9q1Ki@&(Ro4&4{w4l`^>evs7=kQAcKa+?ri z=+K~Z=uNwlJUQ-jW1hJS2JBw&Z#Tw2KBOE+j;VKeqPo0Z`P=eyP1E??^bay1fY5Yy z*2SID7Ge9BXi(BP8V03C8Lf0QYQ;R4MOzh2Q}0(rq?hM-G@|FFxRHka`q55vkjLx( zl73$6)pMt{>RXgAj>|Mu&!@!saHkQm0{L*+LQ892ol|r^5`M<6c`i8EqMgs^!N9dlv9i} z{ME0e7_qOEP@Z(u#62-S2e2t<1eM`__`vNo#LE;z%{vM&>(wr~h4Nw1^ zi1DTnFj^qg@VHRe`_c%^+{c~s&zC@6g}^-LwQfA-?hZV4gQ^dDuny-qWi0DfguF#<`<~y^zq$q@zwfb zlUj1kenN?&qr@hh)y(yIGX59jCFrYN19uO z+t(+)-0foyaYAkXn6uNS2|$ODUcmj{-ll~-&jlXd=u@0W;9JutU{2~-6Mg3S-hQS= z%~l!ZfyeNy@lg2|fM5tNe&@9Vx842aPWc(8#D!tcBi{K}?6b%B$ArcH^h?X;vxftz za)a+PL81Jn8-WaN8ScV4KWQ+)Fh^EpsI-i?d3MHedeAI006pwKiolW;F;GrMaVV&A z24!0&-$5wE;6{ARF>|OuukbzW-06%6PN)+|cMc|523JM^a)fzYWwUX-A?uyI9cLIV zpI*6CFcvCOBJNR84FroNOeke(i>yA^4c-3gR5_bbhe3+cYkDUCYFlECr+LmkjX#Ma z^V#{vfPYif2jGJr&^oRV$MYC1dVZwTrKsq}tM7Vyzw&C^IeD{#*X|tZ^;Oyw_TV!i zp`O1b-P|@;Noo00Be&BmzYd6|zTR4lyswdW;ZC?)2qI)sVE;&(Y@m`(_D$;GL-UZ9 zsTCj)RSr8Y2}SKf!8aMWgNKqPZKJyQ6U?w9RnHUVW{V5hbNQlUos{eKYi}$Jm$ZI5 z_=y{zricr@;I@YUojBks;$x7iLS^3^UX7%5dXVf*VXDS(*dn;VY@V)PXDTVHlE%>R z`6mWREx>@~6AuI$x_C{~>OSO$H#;;oSLDhK3BjCi_3Gppwr%%!Mr$ST8NAe1Fm67B zMj`qo3)Ra-aOG$}7GRw#MgF1j(pZg^o3+|y2A$?>QCQ--2@y`o+Q}L*$WcWAF`}6n z39YHPm88o6WAJ%nuCkwU`T^nbdqH?=w%(oDiJbPbrv7~C=zX#K<*+b@$KZ$F>hg_6+yC;=(0U)Mkzt9uMmrzboJC&%vpvl`qY^-`dB5Z-O2P zrWjHJ{P<=*5%D!+m&9qO@d>RD<^FCcDqh5YRj*EeZ@1fs;t*LKt!-~?e9__Fth?ka zJ4|lz?Q8Y>2e!Jx;zbh!+-4h6!7EKt5+zL(rtX?6Zn-o0e0=ZE1voy%TcM|)#+JXr zp=~BQT39(VQ~gd`B^De&`eL?Yoo4^|>z5Hh<(ebXRhO;+)7c_=z0kJn$pYY1EaIX> z*qQ03eEhd2FPQA^^k*^2!^Jt@Zg5U*;zrXD5=Ty*#XLR~iXGBkWJz6A|5iT|W-DE- zK0sSmha$T)eudt1Iyo+W3w!@KE*mHtdO(>X9jk_kV8spo=_RGRz6u&Y4xT^s?Kl{` zeVM$|d;+K}v3f4u^)R=yPkZoK-s3nmi+LhNw3e`ri7jZX>MZ_Dg<0}g?$|ExxQ1?R zTL?W@f((=`=JqQEEf*d)ngykf;1?mVeKGGe$|3`$4%YDQzHFW>9!~Y~sy<~LHm<)R zAJJvxI`mRlBoH7SZj3tY8Mu5kcL>3jWR#oYvwNyqg+lW1E?ee=eP(GhY+1cSWI{Ek zqF_uoLya?AUFNGjmG`&s@mAO&dff7tN9rPV)7+_U9BD>OW|nv%Li{|Cj1-mk@9Wz0+l3Twm?EJ#!{ z6bVSQ(9jGXvSgj>9~aU%^V~bEU|(gMlV;T~I!E6kiV*R|Np(DWU;3%|&i8i_^VYU3 z2vG2|h5%g($~7nHSj_&pZR>?;$>mz2 zWOYSeAWcO{+?S9PoIY1d6Q_Q(J96&ysJYAI=y8K;zn_N-IxhGE$siYefoap2$(qUb z0%jh+o?z-@(X|^1gx=|gk@-yWf^_ZwK})9pgO&)O!Xo3lHFNP4w9(fx+D3viy$0!p zt%L)?SeBEx?jGf|``R8JMa~>v&;4cLJzh%N#X=y|SvJA}7rN1D&Z&bkUqr~|C2sZA z=(g#Bl9&^;ep__$x%1grN*ccOMT65UcsWtsd zns-%dGMbK#Q{Lj8fU@Y4rK$WG-lbpGW+rIiP5($Q20HxiN4>ZFU>B{MM`$_i_+hO~ zLZ;SW@iQ-}PWjn&()%W(1$33^9Uk-!_S_@PTuTG zS4Mh)N<>v5gwKTa7FI)@YUIo5Quz!?+g2(cR4P|+-s$?WhoIz^JsSaA`rD(L{N-jq zQj9w%9(mDM2IWm3beeKBCl&q>3rU~1?UsF3RR8vzw;J@4SIx7Tnkq*y5n~e9!W{`_B1ZFD?&Q8-&+Zy5SoVTAnGmf#0+C zSSiDX=(Kz_X=k4>EHWLJ7-$!o z>ZF}w$*h{ud2k1;x;mHvj;|8a&YVKO8NCQRF4#X;&WGM^%{f&%{-Sd@`7d^-X3obR zxS$4J*5|N64b&dX5fvKQ+yF`C^O&u8Yyf{M6IUf8<8h{vLpM9~yf=b5bKg>4fh0SM z7JXz4k$0-kMk(MFp=mxaZ;jS6LZwWxc@>nVZ>K+I`R2ReN=V9%^%^6vAaSiO>u>Ef z9mTkK(ufRd;X#9({n5#XBDL*1Ya>4WZJR?K1D5S$i)^BmcL7mZ_fJ1&4v7bs!#>`H zNNP!frPm)rJffuobbkyrv|yF=XT^@z*eee6@wLxb#M3TyEX|XO>?ZEs3tj*mTj-TR7ut1Trm5-(wQ=r6^*=1$(a4K8^smhRf`+&GP4 zvlgWAWl+kDKm&P2?DZ78&5kKMvl*SZ=U0T%gu|c8=)7Et&aT9z>SDkR>r;ROaLEth z#Ixi@_t?6K*=%uAQh)pMptQtZfu_F?-TAR0s4k;XGK4trOS!wN`LnepmR=CH!wiqHVd=O4R zae&<9yHE4i$r|*vXTo`46 zt*w2}vfMGRJ+Ufh?)RBrdQZLR@HTUPY1u4la@33g+XfUXgYo7~R-dUl>Og&=9;OQR zT^8=dtY0P{q{>olF|A%&sOj^hQ5{HLWa0u{p)w*Niq(5T4WZ;H?Se+>-yTf82yvFq zB(f>^?ktpEwyHh8Kc#2}I-j-pb$hY#zE`n{9cnh*)C?%dyCk7pOmhQYf+{vbjdqPb z6kvo{{Cu8x{$&-K0ydQ2HyrH}gZ2RfCf|$9z;5%QricHIzl`+-_pjxj*EPFyd*m{L z_DBRqW}N9Wm3W_zw9%D!?uX#nmmbDKkb*wJ7}LjT`T{7>|GDv>K19fE zAe-&~{R0+A>bbLUQ;7%p@lF4AiSc=YWB$jR{2MZ0y{BDt&P!#pW=I8k}T!}@99tKeAA>ln+`IG8g_7e3< zz2SFo>%Hq>(^G8Am$pi2=}=?&BYZT|@H+YtWY)xXS7>lftlr%XVAP142cg}%P;Uda za$v?yJD0^q0XuznwqY`?t~i4XD?>+?Y*#gm(;vnpEjQ&U_w!qtuA_IGPFZn1-#%0y zr|$62)=?}IC`Q^>G+?P`I=;K@`>~YP!8;$yXsK(lsxiX&*)8LKISE$m2U9)|Jn9Z+ zfbDKix{fZDze_P;Z8NDP-Lso>XJFsTI_~^xmi;GjNlt;u@}-4;WkjI`Z!quUaGaz! z((TheqTdPJsPSrAjrnXWn^W1 zF=}CI*|g2j&QM6Vzie+O@pqMP&#M;CEl4d zug77j4AW`8`q`UgvM_@|4sBOMa?%Q>3abqWm{y4)F)hCK&^Haq`bQa5^?=qS{}2(UUr7WVWz zs`h|?;6t={6iM#4USjIWjP4DOO^@~GqkE}$-*9L<;uJaw`eLM#X$g1E*hs=rt9^hD zq`(4VMzx*kzyGJ0$gV;zV7k6(5FC%a?T)3bj;{8ot_Tf^{;WtP(!;2NQCk6?ycDwJ zGr5)Qbs5Q)k|H`EjIG)H22`^A^q}JvjpG0KRN~m+O%i>h#jy$%{=JtQCkY^ z9I(XdtH1K)9c`~?8@2QUz5{zUmExAKV((@(d<3$d%6D%FeDcJA>Y{6=!rS z=O~r1$C)xjiVzh0zokWOlX{4%0t2^Xr=feL&WV0^(yGvGXkd#P+J>uVi`T>PQMRe| z5c9QQYr$|?uEI+-L?sJMoWy#8jCequYex0O2;WnSvV?;AQjz0%`n{sg=ef{}Y`uz1 zd=H$5_(>`?2jw$qFKA(pm0=UN}EV{mTAl_1Bi~H%7b16!q0^ z4DUT61#{vgU%iSSo9`@a3wfR8Px4@ff*!j5Gxk+^iO8!v&v}w)yE$Qzx1oLyXPx)a zZNfHbY%hS9YOwa>bTK{sT{Pr(6-1$s?jO0=yk=ta(zS^-(x4mt`bzNi9oubTO82m! zWG`(pU-|T035em>ZAd5!C1chEXEy66j*YY^?=t+#zG8S!A8Pspd1jg2;zkKslmQzN zLzYg;R&_eoraEV~x^*VQf1It}6*V?XOH{T#!FlKjb6jW6=kSdOnM&5--S5RAne>BNotmt5M5&ePXiEB*9UsIfvR3p9oc_*?2H{5Qgc^EAJ>x!GmK$6MURC{=vy0Muruv?G!Q4nb+-&HB=;1mE3FrHl?r=^GXi*FwYUBG2b)B~J+!HB*AK zzaMZj)y`S)XHO;FW;i6ua`1V90g-SMWB|4>ydD^*BV@wxNv! zma<58+QW(N^rCCyL$Jnij~8fKQG=$0)OhAWVtwa1+x^eD@k%mN`XMm$G-~$imW!S? zeB!DxCcen#W3L%bTn83vzYm?bwR6=A_wvAMkB)1IF`F=rqi{?P)_rj9QDisWric@w z?fl*qVO^3IXl-vK5bvFwWm~TQ1zB_jQ-7+y_b)+Yx1L#|IRiN?%NL)v3m`QYV#5p@ zYKE^DHb=eZeMfZuGWH%0hodbgGQ<(O56&D`MQQO8nt2-r23U0XrfAjFqE4>rkYF9g zrChC5Na9Qp@yaMP__BrGElIsIG76*1x3`d(Fh(Y8APyVCFVnKVX7q{;8*sA`36uD; zbw#M~lvq0?vG9yHrHq(zJ$aSKXpN6$N<-8xtz8C{Ua2SPu>Gsr{Jdd2D)t831HKmAGHeaQEEA#i9%nUW#t zI=@M5s~AfXdUkTdKb~W;e&ET(oJIyDIPCZPx_T;kp|3zX&qQ_Lw@7z>q@a|DMe`Zt$D>^|lmf1XdHjII+WcdVBqMYF1hc~cRR;8D ztdu!C@Z-27eeo=HeQI3uQCX99;Df=qB5N+=udQ*DFNXeN&8VXXkE_c%^AxUiC@)~! z%=84~jC5S(v^SfLafaE$c?lS)ap=+|Rw`4Q;&7SJO7u^$9fe5|m)JSmpT~V{A);{ezJ{^9t^KWm zum51Tm{dgvW=wL(fk%2{3YHZg(xBX?@EepuC00DsZ>&d5HE=Y1yL~t>0gtY@4Bz_! zx5zROzi>U$8M6CwSU|&+zz~optwY3$%)K|dKF5UfUG9AyH1z$OYg}3I(G}&kR&6w{=KlzA2Wp_iR+R$g$n&!<+NlK-xY1<7b2F!es9h= zY5i1|#=Yrt*J`=IYh@p~nbX=$GrLT+m4&MGZzZzM+y9xy^o*)+XC9&@p|Zl<@_+1q zdkT@1o7jCS?BYMyB2#R3o~tH!=&1;vR5@F0X*NJA>u#9kPQUkEs~v@iSWY|MR8b?% z&n>_WkGHx=_NOl2=jr#tU1u>QU1r`__62>9kLmvsJmTyurS=iEbb{~$_X|m}zh!FV zCnpA5adL8Z6$TUi=kV7RSNMzGe`6?#%W%2%4px)Q$?XjwZ*{fmdG}D!3(d@REmT&1 zRRU}Z{9H;aP9*W_Qg`wkUR582Ze@jGWloMi*-t8mu6>O*t=lqY-jRD&@~dIA1f2!# zJV@t3dc|h^Hki{g=0a`?t{!f6kgXvZ5b!o+@n^^4<=Hgf1(t<%xU!Tqlyj{g7h?V8 z)*%V9D8ZR*_P7YaCUhRag^+^=gL~0Gi~ZU1IO9)E#PvrRf z6*nJ*h+C+l06sj9tXC=^+%{<|&WMF>+xGZTC7j|&8UA0W1?3{|^@Vv}N1CPM*5~~G z;8hS3^W;qa;6SI8Zv92uYO_txfq60kfAv{qV$8L~q}B#(#TVaBYJ3~=w?O%5UEz(r zdEV*8?Gfk&eQxJB6LVjzXtlOnEjJ-Y4`{`iEB#Iov0NWtFIRK*+wT9>Xn%K^Zc7yt zh#k#$E5f)t7wA>CwO1rh7n9KYTXZ|_P06>ufg)nA^&k5wkF zO`R5h04JJsW6kRO7hdJJbaG^zL4dvEZa*RbI$vwuTPk5WeQe2dV@CPtr{7To8%Lbv zx+-mHUx9Tpy50ywpq-PB%tgi{LD*B>3Tj2zU4E!-` zfFIvy1{c=dSX7Gt(HOIC3TsXx0h5Q)%i-L&@$atZdsJs0x3&G`LyFu1Ji^HvDeP3a zwm?xDeY({q41nOhSciDwoSj9T*YTe}SkuqXvgi&|JPt&?d&UskM-5>V@ughY%*mmd7w_E2CcSq)G7~7r2?@q03jysSJx2iRLlwR*yi{H!ERE!+z80%g@G{hg+QthU~ zLPV(vVL9W+9}Morm2ODd{GJzSP4%7}(jN}*U#6jsvHr4n;go|v$Zv^_M77o{ulOa9 S@bAhtKvhvop-#>!;{O3@FB|3n diff --git a/roles/paste/files/skins/fedora/index.html b/roles/paste/files/skins/fedora/index.html deleted file mode 100644 index 8d1c8b69c3..0000000000 --- a/roles/paste/files/skins/fedora/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/roles/paste/files/skins/fedora/js/bootstrap.min.js b/roles/paste/files/skins/fedora/js/bootstrap.min.js deleted file mode 100644 index 97dc88e10a..0000000000 --- a/roles/paste/files/skins/fedora/js/bootstrap.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){a(function(){"use strict",a.support.transition=function(){var b=document.body||document.documentElement,c=b.style,d=c.transition!==undefined||c.WebkitTransition!==undefined||c.MozTransition!==undefined||c.MsTransition!==undefined||c.OTransition!==undefined;return d&&{end:function(){var b="TransitionEnd";return a.browser.webkit?b="webkitTransitionEnd":a.browser.mozilla?b="transitionend":a.browser.opera&&(b="oTransitionEnd"),b}()}}()})}(window.jQuery),!function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype={constructor:c,close:function(b){function f(){e.trigger("closed").remove()}var c=a(this),d=c.attr("data-target"),e;d||(d=c.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),e=a(d),e.trigger("close"),b&&b.preventDefault(),e.length||(e=c.hasClass("alert")?c:c.parent()),e.trigger("close").removeClass("in"),a.support.transition&&e.hasClass("fade")?e.on(a.support.transition.end,f):f()}},a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("alert");e||d.data("alert",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.alert.Constructor=c,a(function(){a("body").on("click.alert.data-api",b,c.prototype.close)})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype={constructor:b,setState:function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},toggle:function(){var a=this.$element.parent('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")}},a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f=typeof c=="object"&&c;e||d.data("button",e=new b(this,f)),c=="toggle"?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a(function(){a("body").on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.carousel.defaults,c),this.options.slide&&this.slide(this.options.slide)};b.prototype={cycle:function(){return this.interval=setInterval(a.proxy(this.next,this),this.options.interval),this},to:function(b){var c=this.$element.find(".active"),d=c.parent().children(),e=d.index(c),f=this;if(b>d.length-1||b<0)return;return this.sliding?this.$element.one("slid",function(){f.to(b)}):e==b?this.pause().cycle():this.slide(b>e?"next":"prev",a(d[b]))},pause:function(){return clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(b,c){var d=this.$element.find(".active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this;if(!e.length)return;return this.sliding=!0,f&&this.pause(),e=e.length?e:this.$element.find(".item")[h](),!a.support.transition&&this.$element.hasClass("slide")?(this.$element.trigger("slide"),d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")):(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),this.$element.trigger("slide"),this.$element.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)})),f&&this.cycle(),this}},a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=typeof c=="object"&&c;e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):typeof c=="string"||(c=f.slide)?e[c]():e.cycle()})},a.fn.carousel.defaults={interval:5e3},a.fn.carousel.Constructor=b,a(function(){a("body").on("click.carousel.data-api","[data-slide]",function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=!e.data("modal")&&a.extend({},e.data(),c.data());e.carousel(f),b.preventDefault()})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find(".in"),e;d&&d.length&&(e=d.data("collapse"),d.collapse("hide"),e||d.data("collapse",null)),this.$element[b](0),this.transition("addClass","show","shown"),this.$element[b](this.$element[0][c])},hide:function(){var a=this.dimension();this.reset(this.$element[a]()),this.transition("removeClass","hide","hidden"),this.$element[a](0)},reset:function(a){var b=this.dimension();this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element.addClass("collapse")},transition:function(b,c,d){var e=this,f=function(){c=="show"&&e.reset(),e.$element.trigger(d)};this.$element.trigger(c)[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=typeof c=="object"&&c;e||d.data("collapse",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a(function(){a("body").on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":c.data();a(e).collapse(f)})})}(window.jQuery),!function(a){function d(){a(b).parent().removeClass("open")}"use strict";var b='[data-toggle="dropdown"]',c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),e=c.attr("data-target"),f,g;return e||(e=c.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,"")),f=a(e),f.length||(f=c.parent()),g=f.hasClass("open"),d(),!g&&f.toggleClass("open"),!1}},a.fn.dropdown=function(b){return this.each(function(){var d=a(this),e=d.data("dropdown");e||d.data("dropdown",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.dropdown.Constructor=c,a(function(){a("html").on("click.dropdown.data-api",d),a("body").on("click.dropdown.data-api",b,c.prototype.toggle)})}(window.jQuery),!function(a){function c(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),d.call(b)},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),d.call(b)})}function d(a){this.$element.hide().trigger("hidden"),e.call(this)}function e(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('