Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
/tmp

# Webpacker
/public/assets
/public/packs
/public/packs-test
/node_modules
Expand Down
92 changes: 92 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# Setting global arguments
ARG BUNDLE_WITHOUT=""
ARG BUNDLE_DEPLOYMENT=false

FROM ruby:3.4-alpine AS build-env

# include global args
ARG BUNDLE_WITHOUT
ARG BUNDLE_DEPLOYMENT

LABEL org.opencontainers.image.authors='pglombardo@hey.com'

# Pacotes necessários para build e desenvolvimento
RUN apk add --no-cache \
git \
build-base \
musl-dev \
libc6-compat \
libpq-dev \
mariadb-dev \
nodejs \
sqlite-dev \
tzdata \
yaml-dev \
yarn \
pkgconf \
openssl-dev

# Atualiza RubyGems para a versão mais recente (ou pula se já for compatível)
RUN gem update --system --no-document

ENV APP_ROOT=/opt/PasswordPusher
WORKDIR ${APP_ROOT}

COPY Gemfile Gemfile.lock package.json yarn.lock ./

ENV RACK_ENV=development RAILS_ENV=development

# Configura o Bundler e instala dependências, incluindo Git
RUN bundle config set without "${BUNDLE_WITHOUT}" \
&& bundle config set deployment "${BUNDLE_DEPLOYMENT}" \
&& bundle install --jobs 4 --retry 3

COPY ./ ${APP_ROOT}/

RUN yarn install \
&& yarn build \
&& bundle exec rails assets:precompile

################## Build done ##################

FROM ruby:3.4-alpine

# include global args
ARG BUNDLE_WITHOUT
ARG BUNDLE_DEPLOYMENT

LABEL maintainer='pglombardo@hey.com'

RUN apk add --no-cache \
bash \
curl \
libc6-compat \
libpq \
mariadb-connector-c \
nodejs \
tzdata \
yarn \
jemalloc

ENV LC_CTYPE=UTF-8 LC_ALL=en_US.UTF-8
ENV APP_ROOT=/opt/PasswordPusher
WORKDIR ${APP_ROOT}
ENV RACK_ENV=development RAILS_ENV=development
ENV LD_PRELOAD=/usr/lib/libjemalloc.so.2

ARG UID=1000
ARG GID=1000
RUN addgroup -g "${GID}" pwpusher \
&& adduser -D -u "${UID}" -G pwpusher pwpusher \
&& chown -R pwpusher:pwpusher ${APP_ROOT}

ENV SECRET_KEY_BASE=783ff1544b9612d8bceb8e26a0bab0cf22543eec658a498e7ef9e1d617976f960092005c8a54cb588759dc6dd8fd054bc4eca4a94dd7b96c6efda4a14a01bfbd

COPY --from=build-env --chown=pwpusher:pwpusher ${APP_ROOT} ${APP_ROOT}/

RUN bundle config set without "${BUNDLE_WITHOUT}" \
&& bundle config set deployment "${BUNDLE_DEPLOYMENT}"

USER pwpusher
EXPOSE 5100
ENTRYPOINT ["containers/docker/entrypoint.sh"]
3 changes: 2 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ gem "invisible_captcha", "~> 2.3"
gem "devise-i18n"
gem "rails-i18n", "~> 7.0.10"
gem "translation"
gem 'fast_gettext', '>= 2.3.0'

# For File Uploads
gem "aws-sdk-s3", require: false
Expand All @@ -123,7 +124,7 @@ group :production, :development do
end

gem "rollbar"
gem "version", git: "https://github.com/pglombardo/version.git", branch: "master"
gem "version", git: "https://github.com/pglombardo/version.git", ref: "97678e0"
gem "administrate", "~> 0.20.1"
gem "rqrcode", "~> 2.2"
gem "turnout2024", require: "turnout"
Expand Down
6 changes: 5 additions & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
GIT
remote: https://github.com/pglombardo/version.git
revision: 97678e0068542fb919f909b0d3a9e853ec7a24c2
branch: master
ref: 97678e0
specs:
version (1.1.1)

Expand Down Expand Up @@ -218,6 +218,9 @@ GEM
faraday-retry (1.0.3)
faraday_middleware (1.2.1)
faraday (~> 1.0)
fast_gettext (4.1.0)
prime
racc
ffi (1.17.1)
foreman (0.88.1)
forwardable (1.3.3)
Expand Down Expand Up @@ -653,6 +656,7 @@ DEPENDENCIES
devise (>= 4.9.0)
devise-i18n
erb_lint (~> 0.9.0)
fast_gettext (>= 2.3.0)
foreman
google-cloud-storage (~> 1.55)
high_voltage
Expand Down
2 changes: 1 addition & 1 deletion app/assets/stylesheets/themes/selected.css
32 changes: 0 additions & 32 deletions app/views/application/_secret_url_bar.html.erb
Original file line number Diff line number Diff line change
@@ -1,37 +1,5 @@
<div class='input-group mb-5 w-75' data-controller="copy">
<input class='form-control' id='secret_url' value='<%= @secret_url %>' spellcheck='false' readonly='true' data-copy-target="payloadDiv">
<% if Settings.language_codes %>
<% if params.key?(:push_locale) %>
<button type="button" class="btn btn-primary">
<em class="me-2 fi fi-<%= Settings.country_codes[params["push_locale"] || I18n.locale] %>"></em>
<%= Settings.language_codes[params["push_locale"] || I18n.locale] %>
</button>
<% else %>
<button type="button" class="btn btn-primary"> 🌎 </button>
<% end %>
<% end %>
<button type="button" class="btn btn-primary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
<li><span class="dropdown-item-text"><%= _('Secret Link Language') %></span></li>
<li><hr class="dropdown-divider"></li>
<% if Settings.language_codes %>
<li class=' dropdown-item '>
<%= link_to url_for, class: "nav-link p-0 m-0 text-muted" do %>
🌎 <%= t('application.secret_url_bar.autodetect') %>
<% end %>
</li>
<% I18n.available_locales.each do |lang| %>
<li class=' dropdown-item '>
<%= link_to url_for(push_locale: lang), class: "nav-link p-0 m-0 text-muted" do %>
<em class="me-2 fi fi-<%= Settings.country_codes[lang] %>"></em>
<%= Settings.language_codes[lang] %>
<% end %>
</li>
<% end %>
<% end %>
</ul>
<button class=' input-group-text btn-success ' data-action="click->copy#miniCopyToClipboard" alt="<%= _('Copy to Clipboard') %>">
<em class="bi bi-clipboard-check"></em>
</button>
Expand Down
118 changes: 1 addition & 117 deletions app/views/passwords/new.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -46,125 +46,9 @@
</div>
</div>
<div class='row'>
<div class='col-12 col-sm-8 p-3'>
<div class='row'>
<div><%= _('Expire secret link and delete after:') %></div>
<div class='col-10'>
<%= range_field_tag("password_expire_after_days", Settings.pw.expire_after_days_default,
{ :name => "password[expire_after_days]",
:class => "form-range",
:min => Settings.pw.expire_after_days_min,
:max => Settings.pw.expire_after_days_max,
:step => "1",
"data-action" => "change->knobs#updateDaysSlider input->knobs#updateDaysSlider",
"data-knobs-target" => "daysRange"
}) %>
</div>
<div class='col-2'>
<div class="form-text" data-knobs-target="daysRangeLabel"><%= Settings.pw.expire_after_days_default %> <%= _('Days') %></div>
</div>
</div>
<div class='row'>
<div class='col-10'>
<%= range_field_tag("password_expire_after_views", Settings.pw.expire_after_views_default,
{ :name => "password[expire_after_views]",
:class => "form-range",
:min => Settings.pw.expire_after_views_min,
:max => Settings.pw.expire_after_views_max,
:step => "1",
"data-action" => "change->knobs#updateViewsSlider input->knobs#updateViewsSlider",
"data-knobs-target" => "viewsRange"
}) %>
</div>

<div class='col-2'>
<div class="form-text" data-knobs-target="viewsRangeLabel"><%= Settings.pw.expire_after_views_default %> <%= _('Views') %></div>
</div>
</div>
<div class='row'>
<div class='col'>
<p class='text-center form-text'><%= _('(whichever comes first)') %></p>
</div>
</div>

<div class='row mb-3'>
<div class='col'>
<div class="list-group mx-0">
<% if Settings.pw.enable_retrieval_step %>
<label class="list-group-item d-flex gap-2">
<%= check_box_tag "password[retrieval_step]", nil, Settings.pw.retrieval_step_default,
{ class: 'form-check-input flex-shrink-0',
"data-knobs-target" => "retrievalStepCheckbox" } %>
<span>
<%= _('Use a 1-click retrieval step') %>
<small class="d-block text-muted"><%= _('Helps to avoid chat systems and URL scanners from eating up views.') %></small>
</span>
</label>
<% end %>
<% if Settings.pw.enable_deletable_pushes %>
<label class="list-group-item d-flex gap-2">
<%= check_box_tag "password[deletable_by_viewer]", nil, Settings.pw.deletable_pushes_default,
{ class: 'form-check-input flex-shrink-0',
"data-knobs-target" => "deletableByViewerCheckbox" } %>
<span>
<%= _('Allow immediate deletion') %>
<small class="d-block text-muted"><%= _('Allow users to delete this push once retrieved.') %></small>
</span>
</label>
<% end %>
</div>
</div>
</div>
<div class='row mb-3'>
<div class='col'>
<div class="input-group">
<span class="input-group-text"><%= _('Passphrase Lockdown') %></span>
<%= f.text_field(:passphrase, { class: "form-control",
autocomplete: "off",
placeholder: _('Optional: Require recipients to enter a passphrase to view this push') }) %>
</div>
</div>
</div>
<div class='row'>
<div class='col'>
<p class='mb-3'>
<div id='cookie-save'>
<a data-action="click->knobs#saveSettings" href="#"><%= _('Save') %></a> <%= _('the above settings as the page default.') %>
</div>
</p>
</div>
</div>
</div>
<div class='col-12 col-sm-4 p-3 mt-3'>
<div class="row mb-3">
<div class="btn-group mb-3" role="group" aria-label="Password Generator button group with nested dropdown">
<button class="btn btn-secondary w-75" type="button"
id='generate_password'
data-knobs-target="generatePasswordButton"
data-action="pwgen#producePassword passwords#updateCharacterCount"><em class="bi bi-cpu"></em> <%= _('Generate Password') %></button>
<button class="btn btn-secondary" type="button" id='configure_generator'
data-action="pwgen#configureGenerator"
data-bs-toggle="modal" data-bs-target="#configureModal">
<em class="bi bi-gear"></em>
</button>
</div>
<p class='fst-italic fw-light'><%= _('Use the button above to generate a random password.') %></p>
</div>
<% if user_signed_in? %>
<div class='row mb-3'>
<div class="input-group">
<span class="input-group-text"><%= _('Reference Note') %></span>
<%= f.text_area(:note, { class: "form-control",
rows: 1,
placeholder: _('Optional'),
autocomplete: "off" }) %>
</div>
<div class="form-text" id="basic-addon4"><%= _('Encrypted and visible only to you') %></div>
</div>
<% end %>
<div class='col-12 col-sm-12 p-3 mt-3'>
<div class='row my-3 px-5'> <hr> </div>
<div class='row mb-3'>
<p class='fst-italic'><%= _('Tip: Only enter a password into the box. Other identifying information can compromise security.') %></p>
<p class='fst-italic fw-light'><%= _('All passwords are encrypted prior to storage and are available to only those with the secret link. Once expired, encrypted passwords are unequivocally deleted from the database.') %></p>
</div>
</div>
Expand Down
15 changes: 0 additions & 15 deletions app/views/passwords/preview.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,6 @@

<p class='mt-5'><%= _('Use this secret link to share it:') %></p>
<%= render partial: 'application/secret_url_bar' %>
<%= @qr_code %>

<p class="d-inline-flex gap-1 mt-5 mb-2">
<button class="btn btn-info" type="button" data-bs-toggle="collapse" data-bs-target="#collapseExample" aria-expanded="false" aria-controls="collapseExample">
<%= _('Print & Share') %>
</button>
</p>
<div class="collapse" id="collapseExample">
<div class="card">
<div class="card-header"><%= _('Generate a Printable Page for End Users') %></div>
Expand Down Expand Up @@ -70,18 +63,10 @@
<p class='mb-5'><%= _('It also includes a') %> <strong><%= _('1-click preliminary retrieval step') %></strong>. </p>
<% end %>

<p class='mb-5'>
<%= link_to _('View This Password Now'), @secret_url, "data-turbo-prefetch": false %> <%= _('(will burn a view) or') %>
<%= link_to _('Push Another Password'), new_password_path %>
</p>

<% if user_signed_in? %>
<%= link_to audit_password_path(@push), class: 'btn btn-secondary btn-sm', rel: 'nofollow' do %>
<em class='bi-card-list'></em> <%= _('View Audit Log') %>
<% end %>
<% end %>

<p class='mt-5 small'> <%= t('pushes.preview.link_lang_tip') %> </p>
<p class='small'> <%= t('pushes.preview.link_lang_auto') %> </p>
</div>
</div>
Loading