Get rid of modernpaste everywhere, redirect it to paste.centos.org everywhere

Signed-off-by: Rick Elrod <relrod@redhat.com>
This commit is contained in:
Rick Elrod 2019-12-03 16:32:25 +00:00 committed by Pierre-Yves Chibon
parent 8ff63fa14b
commit ea96618bd4
86 changed files with 20 additions and 3326 deletions

View file

@ -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"

View file

@ -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

View file

@ -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]

View file

@ -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

View file

@ -196,13 +196,6 @@ mdapi01.stg.phx2.fedoraproject.org
[minimal] [minimal]
bkernel04.phx2.fedoraproject.org bkernel04.phx2.fedoraproject.org
[modernpaste]
modernpaste01.phx2.fedoraproject.org
modernpaste02.phx2.fedoraproject.org
[modernpaste_stg]
modernpaste01.stg.phx2.fedoraproject.org
[bodhi_backend] [bodhi_backend]
# This one handles the mashing/releng stuff # This one handles the mashing/releng stuff
bodhi-backend01.phx2.fedoraproject.org bodhi-backend01.phx2.fedoraproject.org
@ -708,7 +701,6 @@ memcached01.stg.phx2.fedoraproject.org
mm-backend01.stg.phx2.fedoraproject.org mm-backend01.stg.phx2.fedoraproject.org
mm-crawler01.stg.phx2.fedoraproject.org mm-crawler01.stg.phx2.fedoraproject.org
mm-frontend01.stg.phx2.fedoraproject.org mm-frontend01.stg.phx2.fedoraproject.org
modernpaste01.stg.phx2.fedoraproject.org
notifs-backend01.stg.phx2.fedoraproject.org notifs-backend01.stg.phx2.fedoraproject.org
notifs-web01.stg.phx2.fedoraproject.org notifs-web01.stg.phx2.fedoraproject.org
notifs-web02.stg.phx2.fedoraproject.org notifs-web02.stg.phx2.fedoraproject.org

View file

@ -58,7 +58,6 @@
- import_playbook: /srv/web/infra/ansible/playbooks/groups/mariadb-server.yml - 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/mirrormanager.yml
- import_playbook: /srv/web/infra/ansible/playbooks/groups/memcached.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/noc.yml
- import_playbook: /srv/web/infra/ansible/playbooks/groups/notifs-backend.yml - import_playbook: /srv/web/infra/ansible/playbooks/groups/notifs-backend.yml
- import_playbook: /srv/web/infra/ansible/playbooks/groups/notifs-web.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/transtats.yml
#- import_playbook: /srv/web/infra/ansible/playbooks/openshift-apps/waiverdb.yml #- import_playbook: /srv/web/infra/ansible/playbooks/openshift-apps/waiverdb.yml
# These need work to finish and complete and are all stg currently. # 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 #- import_playbook: /srv/web/infra/ansible/playbooks/openshift-apps/rats.yml
# #

View file

@ -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}}"

View file

@ -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"

View file

@ -91,7 +91,13 @@
shortname: fpaste shortname: fpaste
website: fpaste.org website: fpaste.org
regex: /(.*)$ 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 - role: httpd/redirectmatch
shortname: elections shortname: elections

View file

@ -129,12 +129,6 @@
destname: askbot destname: askbot
proxyurl: "{{ varnish_url }}" proxyurl: "{{ varnish_url }}"
- role: httpd/reverseproxy
website: paste.fedoraproject.org
destname: modernpaste
keephost: true
proxyurl: "{{ varnish_url }}"
- role: httpd/reverseproxy - role: httpd/reverseproxy
website: awx.fedoraproject.org website: awx.fedoraproject.org
destname: awx destname: awx

View file

@ -542,9 +542,6 @@
- role: httpd/website - role: httpd/website
site_name: paste.fedoraproject.org site_name: paste.fedoraproject.org
server_aliases:
- paste.stg.fedoraproject.org
- modernpaste.stg.fedoraproject.org
sslonly: true sslonly: true
cert_name: "{{wildcard_cert_name}}" cert_name: "{{wildcard_cert_name}}"

View file

@ -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

View file

@ -291,20 +291,6 @@ children:
Fedora?</a> This site is a starting place for brand new Fedora?</a> This site is a starting place for brand new
contributors to help them figure out where they can contributors to help them figure out where they can
hop on board! 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
<strong>fpaste</strong> command, it will use this site
automatically.
- name: Elections - name: Elections
data: data:
url: https://elections.fedoraproject.org/ url: https://elections.fedoraproject.org/

View file

@ -358,18 +358,6 @@ backend oci-candidate-registry-backend
balance hdr(appserver) balance hdr(appserver)
server oci-candidate-registry01 oci-candidate-registry01:5000 check inter 10s rise 1 fall 2 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 %} {% if 'phx2' in inventory_hostname %}
# Only enable this on phx2 proxies # Only enable this on phx2 proxies

View file

@ -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': [],
},
}

View file

@ -56,18 +56,18 @@
- ipsilon - ipsilon
- ipsilon/oidc_scopes - ipsilon/oidc_scopes
- name: Copy OpenID Connect scope registrations (STAGING) #- name: Copy OpenID Connect scope registrations (STAGING)
copy: src=oidc_scopes/{{item}}.py # copy: src=oidc_scopes/{{item}}.py
dest=/usr/lib/python2.7/site-packages/ipsilon/providers/openidc/plugins/{{item}}.py # dest=/usr/lib/python2.7/site-packages/ipsilon/providers/openidc/plugins/{{item}}.py
owner=root group=root mode=0644 # owner=root group=root mode=0644
when: env == "staging" # when: env == "staging"
with_items: # with_items:
- modernpaste # -
notify: # notify:
- reload apache # - reload apache
tags: # tags:
- ipsilon # - ipsilon
- ipsilon/oidc_scopes # - ipsilon/oidc_scopes
- name: Apply hotfix for taiga to get POST results - name: Apply hotfix for taiga to get POST results
copy: src=openid_server.py copy: src=openid_server.py

View file

@ -25,7 +25,7 @@ global enabled=openid,saml2,openidc
{% if env == "production" %} {% if env == "production" %}
openidc enabled extensions=fedora-account,mbs,beaker,waiverdb,odcs,wiki,src,fpdc,kerneltest openidc enabled extensions=fedora-account,mbs,beaker,waiverdb,odcs,wiki,src,fpdc,kerneltest
{% else %} {% 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 %} {% endif %}
{% if env == 'staging' %} {% if env == 'staging' %}

View file

@ -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])))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

View file

@ -1,15 +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 get_paste_by_id
paste_id = get_decid(sys.argv[1])
paste = get_paste_by_id(paste_id)
print('Decrypted ID: ' + str(paste_id))
print('Title : ' + paste.title)
print('Language : ' + paste.language)
print('Views : ' + str(paste.views))
print('Contents : \n' + paste.contents)

View file

@ -1,265 +0,0 @@
import flask
from flask_login import current_user
from modern_paste import app
import config
from uri.main import *
from uri.paste import *
from util.exception import *
from api.decorators import require_form_args
from api.decorators import require_login_api
from api.decorators import optional_login_api
import constants.api
import database.attachment
import database.paste
import database.user
import util.cryptography
import datetime
@app.route(PasteSubmitURI.path, methods=['POST'])
@require_form_args(['contents'])
@optional_login_api
def submit_paste():
"""
Endpoint for submitting a new paste.
"""
if config.REQUIRE_LOGIN_TO_PASTE and not current_user.is_authenticated:
return (
flask.jsonify(constants.api.UNAUTHENTICATED_PASTES_DISABLED_FAILURE),
constants.api.UNAUTHENTICATED_PASTES_DISABLED_FAILURE_CODE,
)
data = flask.request.get_json()
if not config.ENABLE_PASTE_ATTACHMENTS and len(data.get('attachments', [])) > 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

View file

@ -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 %}
<!--Paste title-->
<div class="paste-title-container section-label">
<p class="sans-serif regular size-1 light-gray less-spaced">PASTE TITLE</p>
<textarea class="paste-title minimal-input-field ubuntu-mono regular gray size-4" autocomplete="off">Untitled</textarea>
</div>
<!--Paste language-->
<div class="paste-language-container section-label">
<p class="sans-serif regular size-1 light-gray less-spaced">PASTE LANGUAGE</p>
<select class="language-selector ubuntu-mono regular gray" name="languages" autocomplete="off">
{% for language in config.LANGUAGES %}
<option value="{{ language|lower }}">{{ language|title }}</option>
{% endfor %}
</select>
</div>
<!--More options-->
<div class="more-options-container section-label">
<span class="more-options-link">
<span class="sans-serif regular size-1 light-gray less-spaced">MORE OPTIONS</span>
<img class="arrow" src="/static/img/icons/arrows.png">
</span>
<!--<p class="option-description sans-serif regular size-1 light-gray less-spaced">PASTE EXPIRATION</p>
<input id="date-time-picker" class="minimal-input-field underlined-input-field ubuntu-mono regular size-3" type="text" autocomplete="off" placeholder="Click to set a date">-->
<p class="option-description sans-serif regular size-1 light-gray less-spaced">PASSWORD</p>
<input type="password" class="paste-password minimal-input-field underlined-input-field regular size-3" autocomplete="off">
</div>
<!--Paste attachments-->
{% if config.ENABLE_PASTE_ATTACHMENTS %}
<div class="paste-attachments-container section-label">
<p class="sans-serif regular size-1 light-gray less-spaced">PASTE ATTACHMENTS</p>
<div class="attachments-upload-section">
<a href="#" class="attachments-browse-button btn btn-default sans-serif semibold size-1 gray less-spaced">BROWSE FILES...</a>
{% if config.MAX_ATTACHMENT_SIZE > 0 %}
<span class="max-size-notice sans-serif regular size-1 light-gray less-spaced">Max size {{ config.MAX_ATTACHMENT_SIZE }} MB</span>
{% endif %}
</div>
<div class="attachments-list hidden ubuntu-mono regular size-2 gray">
<template id="attachment-item-template">
<div class="attachment-item faded">
<i class="delete-attachment-icon fa fa-minus red hidden" aria-hidden="true"></i>
<i class="attachment-loading-icon fa fa-circle-o-notch fa-spin" aria-hidden="true"></i>
<span class="attachment-name"></span>
</div>
</template>
</div>
<input id="attachments-browse-input" class="hidden" type="file" multiple>
</div>
{% endif %}
<!--Paste contents-->
<div class="paste-contents-container">
<p class="sans-serif regular size-1 light-gray less-spaced">PASTE CONTENTS</p>
</div>
<div id="paste-post-contents"></div>
<!--Footer (paste metadata, submit button)-->
<div id="footer">
<div class="statistics-section">
<span>
<span class="line-count sans-serif semibold size-1 white spaced">1</span>
<span class="sans-serif regular size-1 white spaced">LINES</span>
<span class="character-count sans-serif semibold size-1 white spaced">0</span>
<span class="sans-serif regular size-1 white spaced">CHARACTERS</span>
</span>
</div>
<div class="submit-section">
<span class="dark-link-alt">
<a class="paste-download-link sans-serif semibold size-1 white spaced" href="#">DOWNLOAD PASTE AS PLAIN TEXT</a>
<!--Hidden from the user; used to store the plain text data for launching the download via the link above.-->
<a class="paste-download-content hidden" href="#" download></a>
<button type="button" class="submit-button sans-serif semibold white size-2 spaced btn btn-success">
SUBMIT
<i class="submit-arrow fa fa-long-arrow-right"></i>
</button>
</span>
</div>
</div>
<div class="paste-submit-splash splash">
<div class="spinner"><div></div></div>
<p class="uploading-status sans-serif semibold size-2 gray less-spaced"></p>
</div>
<div id="metadata" class="hidden">
<div id="max-attachment-size" data-max-attachment-size="{{ config.MAX_ATTACHMENT_SIZE }}"></div>
</div>
{% endblock %}

View file

@ -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

View file

@ -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 %}

View file

@ -1,6 +0,0 @@
[stickynotes2modernpaste]
{% if env == 'staging' %}
modernpaste = https://paste.stg.fedoraproject.org
{% else %}
modernpaste = https://paste.fedoraproject.org
{% endif %}

View file

@ -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',
]

View file

@ -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

View file

@ -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
<Directory /usr/share/stickynotes2modernpaste>
WSGIProcessGroup stickynotes2modernpaste
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
Order deny,allow
Require all granted
</Directory>
<Directory /usr/share/modern-paste>
Require all granted
</Directory>
DocumentRoot /usr/share/modern-paste
#ErrorLog logs/modern-paste-error.log
#CustomLog logs/modern-paste-access.log combined
#LogLevel info

View file

@ -129,14 +129,6 @@ define service {
use websitetemplate 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 ## Individual hosts

View file

@ -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

View file

@ -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

View file

@ -1,6 +0,0 @@
apiVersion: v1
kind: ImageStream
metadata:
labels:
environment: "modernpaste"
name: "inframodernpaste"

View file

@ -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

View file

@ -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

View file

@ -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',
]

View file

@ -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 }}

View file

@ -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

View file

@ -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"

View file

@ -1,40 +0,0 @@
<?php
/**
* Sticky Notes pastebin
* @ver 0.3
* @license BSD License - www.opensource.org/licenses/bsd-license.php
*
* Copyright (c) 2012 Sayak Banerjee <sayakb@kde.org>
* Copyright (c) 2013 Athmane Madjoudj <athmane@fedoraproject.org>
* 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;
}
}
?>

View file

@ -1,279 +0,0 @@
<?php
/**
* Sticky Notes pastebin
* @ver 0.3
* @license BSD License - www.opensource.org/licenses/bsd-license.php
*
* Copyright (c) 2012 Sayak Banerjee <sayakb@kde.org>
* Copyright (c) 2013 Athmane Madjoudj <athmane@fedoraproject.org>
* 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']} &bull; " . $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']} &bull; " . $lang->get('site_title'));
if ($mode == 'raw')
{
$skin->output(false, true);
}
else if ($mode)
{
echo $skin->output("api_show.{$mode}");
}
else
{
$skin->output();
}
?>

View file

@ -1,561 +0,0 @@
/*
Fedora pastebin styling, based on Koji styling
Copyright (c) 2007,2008, 2009, 2012 Red Hat, Inc.
Authors:
Athmane Madjoudj <athmane@fedoraproject.org>
Original Authors:
Mike Bonnet <mikeb@redhat.com>
Mike McLean <mikem@redhat.com>
Dennis Gilmore <dennis@ausil.us>
*/
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;
}

View file

@ -1,46 +0,0 @@
<div class="row">
<div class="span6 [[error_box]]">
<label for="paste_user">{{your_alias}}</label>
<input id="paste_user" name="paste_user" type="text" value="[[post_user]]"
size="20" maxlength="50" />
<div class="help-inline [[error_visibility]]">{{author_numeric}}</div>
<div id="paste_user_default" class="hidden">{{anonymous}}</div>
<label for="paste_lang" id="paste_lang">{{language}}</label>
<select id="paste_lang" name="paste_lang" class="monospace">
[[post_lang_list]]
</select>
</div>
</div>
<br />
<div class="row">
<div class="span12">
<textarea id="paste_data" class="span12 codebox" name="paste_data" rows="" cols="">[[post_data]]</textarea>
</div>
</div>
<br />
<div class="row">
<div class="span_6_1">
<span class="span6_2">
<label for="paste_password">{{password}}</label>
<input id="paste_password" name="paste_password" type="password" size="20" maxlength="50" />
<label for="paste_private" class="checkbox" id="label_paste_private">
<input id="paste_private" name="paste_private" type="checkbox" checked="yes" [[post_checked]] />
{{private_paste}}
</label>
<select id="paste_expire" name="paste_expire">
<option value="1800">{{del_30min}}</option>
<option value="21600">{{del_6hrs}}</option>
<option value="86400">{{del_1day}}</option>
<option value="604800">{{del_1week}}</option>
<option value="2592000" selected="selected">{{del_1month}}</option>
<option value="0">{{keep_forever}}</option>
</select>
&nbsp;
</span>
<input id="paste_button" type="submit" name="paste_submit" value="{{paste}}" />
</div>
</div>

View file

@ -1,43 +0,0 @@
<h1>
<img src="[[skin_path]]/images/about.png" alt="" />
{{site_name}} &bull; {{about}}
</h1>
<br />
{{powered_by}}
<br /><br />
<div class="row">
<div class="span6">
<ul class="unstyled">
<li>
{{project_home}}
<a href="http://gitorious.org/sticky-notes" rel="nofollow">
http://gitorious.org/sticky-notes
</a>
</li>
<li>
{{developed_by}}
<a href="http://www.sayakbanerjee.com">Sayak Banerjee</a>
</li>
<li>
{{license}}
<a href="http://www.opensource.org/licenses/bsd-license.php" rel="nofollow">
{{bsd_license}}
</a>
</li>
</ul>
</div>
<div class="span6">
<ul class="unstyled">
<li>
{{build}} [[site_build]]
</li>
<li>
{{theme_name}} [[skin_name]]
</li>
<li>
</li>
</ul>
</div>
</div>

View file

@ -1,145 +0,0 @@
<h1>
<img src="[[skin_path]]/images/api.png" alt="" />
{{site_name}} &bull; {{api}}
</h1>
<br />
<div class="row align-center">
<div class="span6">
<div class="thumbnail pull-center">
<img src="[[skin_path]]/images/xml.png" alt="" />
<div class="caption">{{xml_caption}}</div>
</div>
</div>
<div class="span6">
<div class="thumbnail pull-center">
<img src="[[skin_path]]/images/json.png" alt="" />
<div class="caption">{{json_caption}}</div>
</div>
</div>
</div>
<br />
<div class="whitebox whitebox_nomargin">
{{doc_api_para1}}
<ul class="lessmargin">
<li><a href="#create">{{api_lcase}}/{{create_lcase}}</a></li>
<li><a href="#show">{{api_lcase}}/{{show_lcase}}</a></li>
<li><a href="#list">{{api_lcase}}/{{list_lcase}}</a></li>
</ul>
{{doc_api_para2}}
<br />
{{doc_api_para3}}
<hr />
<h3>{{api}} &rarr; {{create}}</h3>
{{doc_api_para4}}
<br /><br />
<h4>{{mandatory_params}}</h4>
<ul class="lessmargin">
<li><i>paste_data</i> - {{paste_text}}</li>
<li><i>paste_lang</i> - {{paste_language}}</li>
<li><i>api_submit</i> - {{set_this_value}}</li>
<li><i>mode</i> - {{mode_xml_json}}</li>
</ul>
<h4>{{optional_params}}</h4>
<ul class="lessmargin">
<li><i>paste_user</i> - {{paste_author}}</li>
<li><i>paste_password</i> - {{paste_pwd}}</li>
<li><i>paste_private</i> - {{paste_pvt}}</li>
<li><i>paste_expire</i> - {{paste_exptime}}</li>
<li><i>paste_project</i> - {{paste_proj}}</li>
</ul>
{{language_list_exp}}
<br /><br />
<h4>{{return_success}}</h4>
<ul class="lessmargin">
<li><i>id</i> - {{id_of_paste}}</li>
<li><i>hash</i> - {{hash_of_paste}}</li>
</ul>
{{url_format_exp}}
<br /><br />
<h4>{{return_error}}</h4>
{{error_ret_exp}}
<ul class="lessmargin">
<li><i>err_nothing_to_do</i> - {{err_ntd}}</li>
<li><i>err_author_numeric</i> - {{err_anum}}</li>
<li><i>err_save_error</i> - {{err_save}}</li>
<li><i>err_spamguard_ipban</i> - {{err_sg_ipban}}</li>
<li><i>err_spamguard_stealth</i> - {{err_sg_stealth}}</li>
<li><i>err_spamguard_noflood</i> - {{err_sg_noflood}}</li>
<li><i>err_spamguard_php</i> - {{err_sg_php}}</li>
</ul>
<hr />
<h3>{{api}} &rarr; {{show}}</h3>
{{doc_api_para5}}
<br /><br />
{{doc_api_para6}}<br />
{{doc_api_para7}}
<br /><br />
<h4>{{mandatory_params}}</h4>
<ul class="lessmargin">
<li><i>id</i> - {{id_of_paste}}</li>
<li><i>format</i> - {{result_format_exp}}</li>
</ul>
<h4>{{optional_params}}</h4>
<ul class="lessmargin">
<li><i>hash</i> - {{hash_of_paste}}</li>
<li><i>password</i> - {{password_of_paste}}</li>
</ul>
<h4>{{return_success}}</h4>
<ul class="lessmargin">
<li><i>id</i> - {{id_of_paste}}</li>
<li><i>author</i> - {{paste_author_exp}}</li>
<li><i>timestamp</i> - {{paste_timestamp}}</li>
<li><i>language</i> - {{paste_lang_exp}}</li>
<li><i>data</i> - {{paste_text_exp}}</li>
</ul>
<h4>{{return_error}}</h4>
{{error_ret_exp}}
<ul class="lessmargin">
<li><i>err_not_found</i> - {{err_404}}</li>
<li><i>err_invalid_hash</i> - {{err_invhash}}</li>
<li><i>err_password_required</i> - {{err_passreqd}}</li>
<li><i>err_invalid_password</i> - {{err_passwrng}}</li>
</ul>
<hr />
<h3>{{api}} &rarr; {{list}}</h3>
{{doc_api_para8}}
<br /><br />
<h4>{{mandatory_params}}</h4>
<ul class="lessmargin">
<li><i>format</i> - {{result_format_exp}}</li>
</ul>
<h4>{{optional_params}}</h4>
<ul class="lessmargin">
<li><i>project</i> - {{paste_proj_exp}}</li>
<li><i>page</i> - {{paste_page}}</li>
</ul>
<h4>{{return_success}}</h4>
<ul class="lessmargin">
<li><i>pastes</i> - {{paste_list_exp}}</li>
<li><i>count</i> - {{paste_count}}</li>
<li><i>pages</i> - {{paste_pages}}</li>
</ul>
<h4>{{return_error}}</h4>
{{error_ret_exp}}
<ul class="lessmargin">
<li><i>err_no_pastes</i> - {{err_nopastes}}</li>
</ul>
</div>

View file

@ -1,82 +0,0 @@
<h1>
<img src="[[skin_path]]/images/help.png" alt="" />
{{site_name}} &bull; {{help}}
</h1>
<br />
<div class="whitebox">
<ul class="list-cozy">
<li>
<a href="#create">{{create_new_paste}}</a>
<ul>
<li><a href="#private">{{marking_private}}</a></li>
<li><a href="#password">{{password_protection}}</a></li>
</ul>
</li>
<li>
<a href="#view">{{view_a_paste}}</a>
<ul class="sublist">
<li><a href="#copy">{{copying_code}}</a></li>
</ul>
</li>
<li>
<a href="#archive">{{paste_archive}}</a>
<ul>
<li><a href="#feed">{{rss_feed}}</a></li>
</ul>
</li>
<li><a href="#projects">{{pastebin_projects}}</a></li>
</ul>
</div>
<div class="whitebox whitebox_nomargin">
<h3 id="create">{{create_new_paste}}</h3>
<div class="align-justify">
{{doc_help_para1}}
</div>
<br />
<h4 id="private">{{marking_private}}</h4>
<div class="align-justify">
{{doc_help_para2}}
</div>
<br />
<h4 id="password">{{password_protection}}</h4>
<div class="align-justify">
{{doc_help_para3}}
</div>
<hr />
<h3 id="view">{{view_a_paste}}</h3>
<div class="align-justify">
{{doc_help_para4}}
</div>
<br />
<h4 id="copy">{{copying_code}}</h4>
<div class="align-justify">
{{doc_help_para5}}
</div>
<hr />
<h3 id="archive">{{paste_archive}}</h3>
<div class="align-justify">
{{doc_help_para6}}
</div>
<br />
<h4 id="feed">{{rss_feed}}</h4>
<div class="align-justify">
{{doc_help_para7}}
</div>
<hr />
<h3 id="projects">{{pastebin_projects}}</h3>
<div class="align-justify">
{{doc_help_para8}}
</div>
</div>

View file

@ -1,20 +0,0 @@
</form>
</div>
<br/><br/>
<footer id="copyright" class="copyright align-center">{{site_copyright}}</footer>
<div class="pre-cache">
<input type="checkbox" checked="checked" />
</div>
<script src="https://apps.fedoraproject.org/fedmenu/js/fedmenu.js"></script>
<script>
fedmenu({
'url': 'https://apps.fedoraproject.org/js/data.js',
'mimeType': 'application/javascript',
'position': 'bottom-right',
});
</script>
</body>
</html>

View file

@ -1,83 +0,0 @@
<!DOCTYPE html>
<html dir="ltr" lang="{{lang_name}}">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="description" content="{{site_name}} is a feature-rich, yet lightweight paste utility" />
<title>[[page_title]]</title>
<link href="[[skin_path]]/images/favicon.ico" rel="shortcut icon" />
<link href="[[nav_rss]]" rel="alternate" type="application/rss+xml" title="{{rss}}" />
<link href="[[skin_path]]/css/fedora.css" rel="stylesheet" type="text/css" media="screen, projection" />
<link href="" rel="stylesheet" type="text/css" media="screen, projection" id="raw_switch" />
<script type="text/javascript" src="[[addon_path]]/jquery/core/jquery.min.js"></script>
<script type="text/javascript" src="[[addon_path]]/jquery/plugins/jquery.cookie.js"></script>
<script type="text/javascript" src="[[skin_path]]/js/bootstrap.min.js"></script>
<script type="text/javascript" src="[[skin_path]]/js/main.js"></script>
<style type="text/css">
[[geshi_stylesheet]]
</style>
</head>
<body>
<div id="wrap">
<div id="innerwrap">
<!-- HEADER -->
<div id="header">
<a class="brand" href="[[nav_newpaste]]"><img src="[[skin_path]]/images/fpaste.png" alt="fpaste Logo" id="fpasteLogo"/></a>
</div><!-- end header -->
<!-- MAIN NAVIGATION -->
<div id="mainNav">
<ul class="nav">
<li>
<a href="[[nav_newpaste]]">
{{newpaste}}
</a>
</li>
<li>
<a href="[[nav_archives]]">
{{archives}}
</a>
</li>
<li>
<a href="[[nav_rss]]">
{{rss}}
</a>
</li>
<li>
<a href="[[nav_api]]">
{{api}}
</a>
</li>
<li>
<a href="[[nav_help]]">
{{help}}
</a>
</li>
<li>
<a href="[[nav_about]]">
{{about}}
</a>
</li>
<li>
<a href="[[nav_admin]]">
{{admin}}
</a>
</li>
</ul>
</div>
<div id="content">
<div class="alert stretch [[msg_visibility]] alert-[[msg_color]]">
<a class="close" data-dismiss="alert">×</a>
[[message_text]]
</div>
<div class="container graybox">
<form id="paste_form" class="form-inline" action="" method="post">

View file

@ -1,202 +0,0 @@
<option value="cpp">C++</option>
<option value="diff">Diff</option>
<option value="gdb">GDB</option>
<option value="javascript">Javascript</option>
<option value="text" selected="selected">Text</option>
<option value="perl">Perl</option>
<option value="php">PHP</option>
<option value="python">Python</option>
<option value="ruby">Ruby</option>
<option value="xml">XML</option>
<option disabled="disabled" value="text">----------------------</option>
<option value="abap">ABAP</option>
<option value="6502acme">ACME Cross Asm</option>
<option value="actionscript">ActionScript</option>
<option value="actionscript3">ActionScript 3</option>
<option value="ada">Ada</option>
<option value="algol68">ALGOL 68</option>
<option value="apache">Apache configuration</option>
<option value="applescript">AppleScript</option>
<option value="apt_sources">Apt sources</option>
<option value="asm">ASM</option>
<option value="asp">ASP</option>
<option value="autoconf">Autoconf</option>
<option value="autohotkey">Autohotkey</option>
<option value="autoit">AutoIt</option>
<option value="avisynth">AviSynth</option>
<option value="awk">awk</option>
<option value="bash">Bash</option>
<option value="basic4gl">Basic4GL</option>
<option value="bf">Brainfuck</option>
<option value="bibtex">BibTeX</option>
<option value="blitzbasic">BlitzBasic</option>
<option value="bnf">bnf</option>
<option value="boo">Boo</option>
<option value="c">C</option>
<option value="c_loadrunner">C (LoadRunner)</option>
<option value="c_mac">C (Mac)</option>
<option value="caddcl">CAD DCL</option>
<option value="cadlisp">CAD Lisp</option>
<option value="cfdg">CFDG</option>
<option value="cfm">ColdFusion</option>
<option value="chaiscript">ChaiScript</option>
<option value="cil">CIL</option>
<option value="clojure">Clojure</option>
<option value="cmake">CMake</option>
<option value="cobol">COBOL</option>
<option value="cpp">C++</option>
<option value="cpp-qt" class="sublang">&nbsp;&nbsp;C++ (Qt)</option>
<option value="csharp">C#</option>
<option value="css">CSS</option>
<option value="cuesheet">Cuesheet</option>
<option value="d">D</option>
<option value="dcs">DCS</option>
<option value="delphi">Delphi</option>
<option value="diff">Diff</option>
<option value="div">DIV</option>
<option value="dos">DOS</option>
<option value="dot">dot</option>
<option value="e">E</option>
<option value="ecmascript">ECMAScript</option>
<option value="eiffel">Eiffel</option>
<option value="email">eMail (mbox)</option>
<option value="epc">EPC</option>
<option value="erlang">Erlang</option>
<option value="f1">Formula One</option>
<option value="falcon">Falcon</option>
<option value="fo">FO (abas-ERP)</option>
<option value="fortran">Fortran</option>
<option value="freebasic">FreeBasic</option>
<option value="fsharp">F#</option>
<option value="4cs">GADV 4CS</option>
<option value="gambas">GAMBAS</option>
<option value="gdb">GDB</option>
<option value="genero">genero</option>
<option value="genie">Genie</option>
<option value="gettext">GNU Gettext</option>
<option value="glsl">glSlang</option>
<option value="gml">GML</option>
<option value="gnuplot">Gnuplot</option>
<option value="go">Go</option>
<option value="groovy">Groovy</option>
<option value="gwbasic">GwBasic</option>
<option value="haskell">Haskell</option>
<option value="hicest">HicEst</option>
<option value="68000devpac">HiSoft Devpac ST 2 Asm</option>
<option value="hq9plus">HQ9+</option>
<option value="html4strict">HTML</option>
<option value="icon">Icon</option>
<option value="idl">Uno Idl</option>
<option value="ini">INI</option>
<option value="inno">Inno</option>
<option value="intercal">INTERCAL</option>
<option value="io">Io</option>
<option value="j">J</option>
<option value="java">Java</option>
<option value="java5">J2SE</option>
<option value="javascript">Javascript</option>
<option value="jquery">jQuery</option>
<option value="6502kickass">Kick Asm</option>
<option value="kixtart">KiXtart</option>
<option value="klonec">KLone C</option>
<option value="klonecpp">KLone C++</option>
<option value="latex">LaTeX</option>
<option value="lb">Liberty BASIC</option>
<option value="lisp">Lisp</option>
<option value="locobasic">Locomotive Basic</option>
<option value="logtalk">Logtalk</option>
<option value="lolcode">LOLcode</option>
<option value="lotusformulas">Lotus Notes</option>
<option value="lotusscript">LotusScript</option>
<option value="lscript">LScript</option>
<option value="lsl2">LSL2</option>
<option value="lua">Lua</option>
<option value="m68k">Motorola 68000 Asm</option>
<option value="magiksf">MagikSF</option>
<option value="make">GNU make</option>
<option value="mapbasic">MapBasic</option>
<option value="matlab">Matlab M</option>
<option value="mirc">mIRC Scripting</option>
<option value="mmix">MMIX</option>
<option value="modula2">Modula-2</option>
<option value="modula3">Modula-3</option>
<option value="mpasm">Microchip Asm</option>
<option value="mxml">MXML</option>
<option value="mysql">MySQL</option>
<option value="newlisp">newlisp</option>
<option value="nsis">NSIS</option>
<option value="oberon2">Oberon-2</option>
<option value="objc">Objective-C</option>
<option value="objeck">Objeck</option>
<option value="ocaml">OCaml</option>
<option value="ocaml-brief" class="sublang">&nbsp;&nbsp;OCaml (brief)</option>
<option value="oobas">OpenOffice.org Basic</option>
<option value="oracle11">Oracle 11 SQL</option>
<option value="oracle8">Oracle 8 SQL</option>
<option value="oxygene">Oxygene (Delphi Prism)</option>
<option value="oz">OZ</option>
<option value="pascal">Pascal</option>
<option value="pcre">PCRE</option>
<option value="per">per</option>
<option value="perl">Perl</option>
<option value="perl6">Perl 6</option>
<option value="pf">OpenBSD Packet Filter</option>
<option value="php">PHP</option>
<option value="php-brief" class="sublang">&nbsp;&nbsp;PHP (brief)</option>
<option value="pic16">PIC16</option>
<option value="pike">Pike</option>
<option value="pixelbender">Pixel Bender 1.0</option>
<option value="plsql">PL/SQL</option>
<option value="postgresql">PostgreSQL</option>
<option value="povray">POVRAY</option>
<option value="powerbuilder">PowerBuilder</option>
<option value="powershell">PowerShell</option>
<option value="progress">Progress</option>
<option value="prolog">Prolog</option>
<option value="properties">PROPERTIES</option>
<option value="providex">ProvideX</option>
<option value="purebasic">PureBasic</option>
<option value="python">Python</option>
<option value="q">q/kdb+</option>
<option value="qbasic">QBasic/QuickBASIC</option>
<option value="rails">Rails</option>
<option value="rebol">REBOL</option>
<option value="reg">Microsoft Registry</option>
<option value="robots">robots.txt</option>
<option value="rpmspec">RPM Specification File</option>
<option value="rsplus">R / S+</option>
<option value="ruby">Ruby</option>
<option value="sas">SAS</option>
<option value="scala">Scala</option>
<option value="scheme">Scheme</option>
<option value="scilab">SciLab</option>
<option value="sdlbasic">sdlBasic</option>
<option value="smalltalk">Smalltalk</option>
<option value="smarty">Smarty</option>
<option value="sql">SQL</option>
<option value="systemverilog">SystemVerilog</option>
<option value="6502tasm">TASM/64TASS 1.46 Asm</option>
<option value="tcl">TCL</option>
<option value="teraterm">Tera Term Macro</option>
<option value="text">Text</option>
<option value="thinbasic">thinBasic</option>
<option value="tsql">T-SQL</option>
<option value="typoscript">TypoScript</option>
<option value="unicon">Unicon</option>
<option value="vala">Vala</option>
<option value="vb">Visual Basic</option>
<option value="vbnet">VB.NET</option>
<option value="verilog">Verilog</option>
<option value="vhdl">VHDL</option>
<option value="vim">Vim Script</option>
<option value="visualfoxpro">Visual Fox Pro</option>
<option value="visualprolog">Visual Prolog</option>
<option value="whitespace">Whitespace</option>
<option value="whois">Whois (RPSL format)</option>
<option value="winbatch">Winbatch</option>
<option value="xbasic">XBasic</option>
<option value="xml">XML</option>
<option value="xorg_conf">Xorg configuration</option>
<option value="xpp">X++</option>
<option value="z80">ZiLOG Z80 Asm</option>
<option value="zxbasic">ZXBasic</option>

View file

@ -1,22 +0,0 @@
<div class="[[data_visibility]] pagination pull-right">
[[list_pagination]]
</div>
<h1>
<img src="[[skin_path]]/images/list.png" alt="" />
{{archives}}
</h1>
<br class="[[data_visibility]]" />
<div class="[[data_visibility]]">
[[list_data]]
</div>
<div class="[[error_visibility]] hero-unit align-center">
<h1>[[error_text]]</h1>
</div>
<div class="[[data_visibility]] pagination pagination_bottom">
[[list_pagination]]
</div>

View file

@ -1,19 +0,0 @@
<div class="row">
<div class="span12">
<div class="whitebox">
<div class="pull-right">
<a href="[[paste_url]]" class="btn btn-info">{{view_paste}}</a>
</div>
<legend>{{paste}} #[[paste_id]]</legend>
<hr />
<div class="codewrap_small">
[[paste_data]]
</div>
<hr />
<div class="pull-right pasteinfo"><i>[[paste_info]]</i></div>
<div class="pasteinfo"><i>{{language}}: [[paste_lang]]</i></div>
</div>
</div>
</div>

View file

@ -1,27 +0,0 @@
<div class="[[data_visibility]]">
<div class="whitebox whitebox_nomargin">
<div class="pull-right">
<a id="wrap_toggle" href="#" class="btn btn-info">{{wrap}}</a>
<a class="btn btn-info" href="[[raw_url]]">{{view_raw}}</a>
</div>
<div class="imagefix">
<strong>Shortened URL</strong>: <a href="[[short_url]]">[[short_url]]</a>
</div>
<hr />
<div class="codewrap">
[[paste_data]]
</div>
<hr />
<div class="pull-right pasteinfo"><i>[[paste_info]]</i></div>
<div class="pasteinfo"><i>{{language}}: [[paste_lang]]</i></div>
</div>
</div>
<div class="hero-unit align-center nomargin [[error_visibility]]">
<div class="error">
<h1>[[error_text]]</h1>
</div>
</div>

View file

@ -1,14 +0,0 @@
<div class="hero-unit align-center nomargin">
<h1>{{pass_protect}}</h1>
<hr />
<br />
<div class="input-prepend">
<span class="add-on">
<i class="icon-lock"></i>
</span>
<input id="password" class="pull-right" name="password" type="password" size="20" maxlength="50" />
</div>
<br /><br />
<input class="btn btn-large btn-success" id="pass_submit" type="submit" value="{{submit}}" />
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 405 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 565 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 747 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 533 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 672 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 681 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 777 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 719 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View file

@ -1 +0,0 @@

File diff suppressed because one or more lines are too long

View file

@ -1,132 +0,0 @@
/**
* Sticky Notes pastebin
* @ver 0.3
* @license BSD License - www.opensource.org/licenses/bsd-license.php
*
* Copyright (c) 2012 Sayak Banerjee <sayakb@kde.org>
* All rights reserved. Do not remove this copyright notice.
*/
var IsIe = (navigator.appName.indexOf("Microsoft") >= 0);
var privateChecked = false, captured = false;
// Startup function
$(document).ready(function() {
// Disable auto complete
$('#paste_form').attr('autocomplete', 'off');
// Remove dotted lines around links
$('a').click(function() {
this.blur();
});
// Remove dotted line for drop menus
$('select').change(function() {
this.blur();
});
// Check if private box is checked
if ($('#paste_private').is(':checked'))
{
privateChecked = true;
}
else
{
privateChecked = false;
}
$('#paste_private').click(function() {
if ($(this).is(':checked'))
{
privateChecked = true;
}
else
{
privateChecked = false;
}
});
// Update private checkbox if password is entered
setInterval(function() {
if ($('#paste_password').val() != '') {
$('#paste_private').attr('checked', true);
captured = true;
}
else if (captured && $('#paste_password').val() == '') {
$('#paste_private').attr('checked', privateChecked);
captured = false;
}
}, 100);
// Fetch author and language values from cookies
var author = $.cookie('stickynotes_author');
var language = $.cookie('stickynotes_language');
var index = -1;
if (author != null) {
$('#paste_user').val(author);
}
for (i = 1; i <= 10; i++) {
var $option = $('#paste_lang option:nth-child(' + i.toString() + ')');
if ($option.attr('value') == language) {
index = i - 1;
}
}
if (language != null && index < 0) {
$('#paste_lang').val(language);
} else if (language != null) {
$('#paste_lang').get(0).selectedIndex = index;
}
// Insert tab in the code box
$('#paste_data').keydown(function (e) {
if (e.keyCode == 9) {
var myValue = "\t";
var startPos = this.selectionStart;
var endPos = this.selectionEnd;
var scrollTop = this.scrollTop;
this.value = this.value.substring(0, startPos) + myValue + this.value.substring(endPos,this.value.length);
this.focus();
this.selectionStart = startPos + myValue.length;
this.selectionEnd = startPos + myValue.length;
this.scrollTop = scrollTop;
e.preventDefault();
}
});
// Alias textbox functions
var defaultUser = $('#paste_user_default').html();
$('#paste_user')
.click(function() {
if ($(this).val() == defaultUser) {
$(this).val('');
}
})
.focusout(function() {
if ($(this).val().length == 0) {
$(this).val(defaultUser);
}
});
// Toggle code wrapping
$('#wrap_toggle').click(function() {
var isWrapped = $('.codewrap div').css('white-space') != 'nowrap';
if (isWrapped) {
$('.codewrap div').css('white-space', 'nowrap');
} else {
$('.codewrap div').css('white-space', 'inherit');
}
return false;
});
// Remove php geshi inline css in code area
$(".codewrap ol li").removeAttr("style");
$(".codewrap_small ol li").removeAttr("style");
});

View file

@ -1,55 +0,0 @@
Alias / "/usr/share/sticky-notes/"
<Directory /usr/share/sticky-notes/>
# Allow from all
# AllowOverride all
# Options None
# Order allow,deny
<IfModule mod_rewrite.c>
# Tell PHP that rewrite rules are available
SetEnv HTTP_MOD_REWRITE On
# Rewrite rules
RewriteEngine on
RewriteBase /
# Setup link
RewriteRule ^install/?$ install.php [NC]
# Documentation links
RewriteRule ^doc/([a-z]+)/?$ doc.php?cat=$1 [NC]
RewriteRule ^~([a-z.]+)/doc/([a-z]+)/?$ doc.php?project=$1&cat=$2 [NC]
# Home page links
RewriteRule ^~([a-z.]+)/?$ index.php?project=$1 [NC]
RewriteRule ^~([a-z.]+)/api/([a-z]+)/?$ index.php?project=$1&mode=$2 [NC]
# Paste list
RewriteRule ^all/?$ list.php [NC]
RewriteRule ^api/([a-z]+)/all/?$ list.php?mode=$1 [NC]
RewriteRule ^~([a-z.]+)/all/?$ list.php?project=$1 [NC]
RewriteRule ^~([a-z.]+)/api/([a-z]+)/all/?$ list.php?project=$1&mode=$2 [NC]
RewriteRule ^rss/?$ list.php?rss=1 [NC]
RewriteRule ^~([a-z.]+)/rss/?$ list.php?project=$1&rss=1 [NC]
RewriteRule ^all/([0-9]+)/?$ list.php?page=$1 [NC]
RewriteRule ^api/([a-z]+)/all/([0-9]+)/?$ list.php?mode=$1&page=$2 [NC]
RewriteRule ^~([a-z.]+)/all/([0-9]+)/?$ list.php?project=$1&page=$2 [NC]
RewriteRule ^~([a-z.]+)/api/([a-z]+)/all/([0-9]+)/?$ list.php?project=$1&mode=$2&page=$3 [NC]
# General links
RewriteRule ^([0-9]+)/?$ show.php?id=$1 [NC]
RewriteRule ^~([a-z.]+)/([0-9]+)/?$ show.php?project=$1&id=$2 [NC]
RewriteRule ^([0-9]+)/([a-z|A-Z]+)/?$ show.php?id=$1&mode=$2 [NC]
RewriteRule ^~([a-z.]+)/([0-9]+)/([a-z|A-Z]+)/?$ show.php?project=$1&id=$2&mode=$3 [NC]
RewriteRule ^api/([a-z|A-Z]+)/([0-9]+)/?$ show.php?mode=$1&id=$2 [NC]
RewriteRule ^~([a-z.]+)/api/([a-z|A-Z]+)/([0-9]+)/?$ show.php?project=$1&mode=$2&id=$3 [NC]
RewriteRule ^([0-9]+)/([0-9]+)/?$ show.php?id=$1&hash=$2 [NC]
RewriteRule ^~([a-z.]+)/([0-9]+)/([0-9]+)/?$ show.php?project=$1&id=$2&hash=$3 [NC]
RewriteRule ^([0-9]+)/([0-9]+)/([a-z|A-Z]+)/?$ show.php?id=$1&hash=$2&mode=$3 [NC]
RewriteRule ^~([a-z.]+)/([0-9]+)/([0-9]+)/([a-z|A-Z]+)/?$ show.php?project=$1&id=$2&hash=$3&mode=$4 [NC]
RewriteRule ^api/([a-z|A-Z]+)/([0-9]+)/([0-9]+)/?$ show.php?mode=$1&id=$2&hash=$3 [NC]
RewriteRule ^~([a-z.]+)/api/([a-z|A-Z]+)/([0-9]+)/([0-9]+)/?$ show.php?project=$1&mode=$2&id=$3&hash=$4 [NC]
RewriteRule ^api/([a-z|A-Z]+)/([0-9]+)/([0-9]+)/(.*)$ show.php?mode=$1&id=$2&hash=$3&password=$4 [NC]
RewriteRule ^~([a-z.]+)/api/([a-z|A-Z]+)/([0-9]+)/([0-9]+)/(.*)$ show.php?project=$1&mode=$2&id=$3&hash=$4&password=$5 [NC]
</IfModule>
</Directory>

View file

@ -1 +0,0 @@
post_max_size = 512K

View file

@ -1,54 +0,0 @@
---
#
# Setup paste
#
- name: install needed packages
package: name={{ item }} state=present
with_items:
- sticky-notes
- php-cli
- php-common
- php-mbstring
- php-mysql
- php-geshi
- php-pdo
- httpd
- httpd-tools
- rsync
tags:
- packages
- name: Fedora branding
copy: src=skins/fedora/ dest=/usr/share/sticky-notes/skins/fedora owner=root group=root mode=775
tags:
- config
- name: sticky-notes httpd config
copy: src=sticky-notes.conf dest=/etc/httpd/conf.d/sticky-notes.conf owner=root group=root mode=644
tags:
- config
notify: reload httpd
- name: sticky-notes php config
template: src=config.php dest=/etc/sticky-notes/config.php owner=apache group=apache mode=600
tags:
- config
notify: reload httpd
- name: php post limit config
copy: src=sticky-notes.ini dest=/etc/php.d/sticky-notes.ini owner=root group=root mode=644
notify: reload httpd
- name: Use da.gd instead of ur1.ca
copy: src=class_urlshort.php dest=/usr/share/sticky-notes/classes/class_urlshort.php owner=root group=root mode=644
notify: reload httpd
- name: Hotfix show.php
copy: src=show.php dest=/usr/share/sticky-notes/show.php owner=root group=root mode=644
notify: reload httpd
- name: set sebooleans so paste can talk to the db
seboolean: name=httpd_can_network_connect_db state=true persistent=true
- name: startup apache
service: name=httpd enabled=yes state=started

View file

@ -1,158 +0,0 @@
<?php
// Sticky Notes Pastebin configuration file
// (C) 2012 Sayak Banerjee. All rights reserved
/// This is an auto generated file
/// Please DO NOT modify manually
/// Unless you are absolutely sure what you're doing ;-)
{% if env == "staging" %}
$db_host = "db03.stg";
{% else %}
$db_host = "db-paste";
{% endif %}
$db_port = "";
$db_name = "pastebin";
$db_username = "{{ pastebin_user }}";
$db_password = "{{ pastebinDBPassword }}";
$db_prefix = "paste_";
$site_name = "Fedora Sticky Notes";
$site_title = "Fedora Project Pastebin";
$site_copyright = "Powered by &lt;a href=&quot;http://www.sayakbanerjee.com/sticky-notes/&quot; rel=&quot;nofollow&quot;&gt;Sticky Notes&lt;/a&gt;. Using &lt;a href=&quot;http://github.com/athmane/sticky-notes-fedora-skin&quot;&gt;Fedora skin&lt;/a&gt;.
&lt;br/&gt;
&quot;Sticky Notes&quot; (the web application) is released under the BSD license,
Copyright &Acirc;&copy; 2012 &lt;a href=&quot;http://sayakbanerjee.com&quot;&gt;Sayak Banerjee&lt;/a&gt;.
&lt;p&gt;&quot;Fedora&quot; and the Fedora logo are trademarks of Red Hat, Inc. The Fedora project is maintained and driven by the community. This is a community maintained site. Red Hat is not responsible for content.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://fedoraproject.org/en/sponsors&quot;&gt;Sponsors&lt;/a&gt; | &lt;a href=&quot;http://fedoraproject.org/wiki/Legal:Main&quot;&gt;Legal&lt;/a&gt; | &lt;a href=&quot;http://fedoraproject.org/wiki/Legal:Trademark_guidelines&quot;&gt;Trademark Guidelines&lt;/a&gt;&lt;/p&gt;";
$skin_name = "Fedora";
$lang_name = "en-gb";
$admin_skin_name = "Greyscale";
$admin_lang_name = "en-gb";
$sg_services = "ipban,stealth,noflood,php,censor";
$sg_php_key = "";
$sg_php_days = 90;
$sg_php_score = 50;
$sg_php_type = 2;
$sg_censor = "vipshare.me
bubbajeen.com
DDoS target
http://bit.ly/
tinyurl.com
freepremium.info.tm
filevis.com
terafile.co
lafiles.com
salefiles.com
1fichier.com
adf.ly
4shared.com
bayfiles.com
bitshare.com
box.net
ex-load.com
datafile.com
depositfiles.com
esnips.com
file4go.com
filefactory.com
filerio.in
fileom.com
fileserve.com
fileswap.com
freakshare.com
hotfile.com
how-do-i-make-my-computer
jumbofiles.com
keep2share.cc
koofile.com
kookfile.com
lumfile.com
mediafire.com
oteupload.com
putlocker.com
rapidgator.net
rapidshare.com
redload.net
www.secureupload.eu
secureupload.eu
share-online.biz
sharpfile.com
takebin.com
turbobit.net
uppit.com
uploaded.com
uploaded.net
uploading.com
zippyshare.com
zshare.com
3movs.com
3pic.com
4tube.com
89.com
91porn.com
adultmovies.com
adultxpix.net
amateurs-gone-wild.com
apetube.com
askjolene.com
beeg.com
bustnow.com
cliphunter.com
elephantlist.com
empflix.com
glamourbabez.com
hpornstars.com
isharemybitch.com
jerk2it.com
junocloud.me
keezmovies.com
linkhumper.com
maxporn.com
megaporn.com
mofosex.com
nastyrat.com
officesexx.com
pichunter.com
pixandvideo.com
poguide.com
pornhub.com
pornolunch.com
pornrabbit.com
pornstar-paradise.com
porntube.com
pornyeah.com
redtube.com
sexmummy.com
shufuni.com
slutload.com
tiava.com
tjoob.com
tube8.com
ultra-pornstars.com
vho.com
worldsex.com
www.kookfile.com
www.uploadable.ch
xhamster.com
xnxx.com
xvideos.com
xxxblackbook.com
youporn.com
yourporntube.com
cl-security.org";
$auth_method = "db";
$ldap_server = "";
$ldap_port = "";
$ldap_base_dn = "";
$ldap_uid = "";
$ldap_filter = "";
$ldap_user_dn = "";
$ldap_password = "";
?>

View file

@ -1,4 +0,0 @@
RewriteEngine On
ProxyPass {{ path }} {{ proxyurl }}/
ProxyPassReverse {{ path }} {{ proxyurl }}/

View file

@ -87,11 +87,6 @@ backend kerneltest {
.port = "10038"; .port = "10038";
} }
backend paste {
.host = "localhost";
.port = "10055";
}
backend registry { backend registry {
.host = "localhost"; .host = "localhost";
.port = "10048"; .port = "10048";
@ -197,14 +192,6 @@ sub vcl_recv {
if (req.url ~ "^/freemedia/") { if (req.url ~ "^/freemedia/") {
set req.backend_hint = freemedia; set req.backend_hint = freemedia;
} }
if (req.http.X-Forwarded-Server ~ "^paste.fedoraproject.org") {
set req.backend_hint = paste;
if (req.url ~ "^/static/") {
unset req.http.cookie;
set req.http.clear-cookies = "yes";
set req.url = regsub(req.url, "\?.*", "");
}
}
if (req.http.X-Forwarded-Server ~ "^ask.fedoraproject.org") { if (req.http.X-Forwarded-Server ~ "^ask.fedoraproject.org") {
set req.backend_hint = askbot; set req.backend_hint = askbot;
if (req.url ~ "^/m/") { if (req.url ~ "^/m/") {