Merge branch 'master' into feature/rs-oauth

This commit is contained in:
Râu Cao 2023-07-04 16:43:32 +02:00
commit e1e83386a8
Signed by: raucao
GPG Key ID: 15E65F399D084BA9
23 changed files with 296 additions and 158 deletions

View File

@ -9,9 +9,9 @@ RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
RUN apt-get update && apt-get install -y nodejs RUN apt-get update && apt-get install -y nodejs
WORKDIR /akkounts WORKDIR /akkounts
COPY Gemfile /akkounts/Gemfile
COPY Gemfile.lock /akkounts/Gemfile.lock COPY ["Gemfile", "Gemfile.lock", "package.json", "./"]
COPY package.json /akkounts/package.json
RUN bundle install RUN bundle install
RUN gem install foreman RUN gem install foreman
RUN npm install -g yarn RUN npm install -g yarn

View File

@ -57,6 +57,7 @@ gem "sentry-rails"
# Services # Services
gem 'discourse_api' gem 'discourse_api'
gem "lnurl"
gem 'nostr', git: 'https://gitea.kosmos.org/kosmos/nostr-gem.git', branch: 'feature/ruby_2.7_compat' gem 'nostr', git: 'https://gitea.kosmos.org/kosmos/nostr-gem.git', branch: 'feature/ruby_2.7_compat'
group :development, :test do group :development, :test do

View File

@ -206,6 +206,8 @@ GEM
listen (3.8.0) listen (3.8.0)
rb-fsevent (~> 0.10, >= 0.10.3) rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10) rb-inotify (~> 0.9, >= 0.9.10)
lnurl (1.0.1)
bech32 (~> 1.1)
lockbox (1.2.0) lockbox (1.2.0)
loofah (2.21.3) loofah (2.21.3)
crass (~> 1.0.2) crass (~> 1.0.2)
@ -434,6 +436,7 @@ DEPENDENCIES
letter_opener letter_opener
letter_opener_web letter_opener_web
listen (~> 3.2) listen (~> 3.2)
lnurl
lockbox lockbox
net-ldap net-ldap
nostr! nostr!

View File

@ -14,7 +14,6 @@ so:
1. Make sure [Docker Compose is installed][1] and Docker is running (included in 1. Make sure [Docker Compose is installed][1] and Docker is running (included in
Docker Desktop) Docker Desktop)
2. Uncomment the `redis`, `web`, and `sidekiq` sections in `docker-compose.yml`
3. Run `docker compose up` and wait until 389ds announces its successful start 3. Run `docker compose up` and wait until 389ds announces its successful start
in the log output in the log output
4. `docker-compose exec ldap dsconf localhost backend create --suffix="dc=kosmos,dc=org" --be-name="dev"` 4. `docker-compose exec ldap dsconf localhost backend create --suffix="dc=kosmos,dc=org" --be-name="dev"`
@ -53,12 +52,14 @@ Running all specs:
### Docker (Compose) ### Docker (Compose)
There is a working Docker Compose config file, which allows you to spin up both There is a working Docker Compose config file, which define a number of services including
an app server for Rails as well as a local 389ds (LDAP) server. an app server for Rails as well as a local 389ds (LDAP) server.
By default, `docker-compose up` will only start the LDAP server, listening on For Rails developers, you probably just want to start the LDAP server: `docker-compose up ldap`,
port 389 on your machine. Uncomment other services in `docker-compose.yml` if listening on port 389 on your machine.
you want to use them.
You can pick and choose your services adding them by name (listed in `docker-compose.yml`) at
the end of the docker compose command. eg. `docker compose up ldap redis`
#### LDAP server #### LDAP server

View File

@ -1,4 +1,6 @@
<%= tag.public_send(@tag, class: "mb-6 last:mb-0") do %> <%= tag.public_send(@tag, class: "mb-6 last:mb-0", data: {
:'field-name' => @field_name
}) do %>
<% if @positioning == :vertical %> <% if @positioning == :vertical %>
<label class="block"> <label class="block">
<p class="font-bold <%= @descripton.present? ? "mb-1" : "mb-2" %>"> <p class="font-bold <%= @descripton.present? ? "mb-1" : "mb-2" %>">
@ -9,7 +11,21 @@
<%= @descripton %> <%= @descripton %>
</p> </p>
<% end %> <% end %>
<%= content %>
<%= tag.p class: "flex gap-x-1", data: {
controller: @resettable ? "settings--resettable-field" : nil,
} do %>
<%= content %>
<% if @resettable %>
<button type="button"
class="relative grow-0 shrink-0 btn-md btn-outline text-red-700"
title="Reset to default value"
data-settings--resettable-field-target="resetButton"
data-action="settings--resettable-field#resetField">
Reset
</button>
<% end %>
<% end %>
</label> </label>
<% elsif @positioning == :horizontal %> <% elsif @positioning == :horizontal %>
<label class="block flex items-center justify-between"> <label class="block flex items-center justify-between">

View File

@ -2,11 +2,15 @@
module FormElements module FormElements
class FieldsetComponent < ViewComponent::Base class FieldsetComponent < ViewComponent::Base
def initialize(tag: "li", positioning: :vertical, title:, description: nil) def initialize(tag: "li", positioning: :vertical,
title:, description: nil,
field_name: nil, resettable: false)
@tag = tag @tag = tag
@positioning = positioning @positioning = positioning
@title = title @title = title
@descripton = description @descripton = description
@field_name = field_name
@resettable = resettable
end end
end end
end end

View File

@ -0,0 +1,13 @@
<%= render FormElements::FieldsetComponent.new(
title: @title,
description: @description,
field_name: "setting_#{@key.to_s}",
resettable: @resettable
) do %>
<%= method("#{@type}_field").call :setting, @key,
value: Setting.public_send(@key),
data: {
:'default-value' => Setting.get_field(@key)[:default]
},
class: "w-full" %>
<% end %>

View File

@ -0,0 +1,20 @@
# frozen_string_literal: true
module FormElements
class FieldsetResettableSettingComponent < ViewComponent::Base
def initialize(tag: "li", key:, type: :text, title:, description: nil)
@tag = tag
@positioning = :vertical
@title = title
@descripton = description
@key = key.to_sym
@type = type
@resettable = is_resettable?(@key)
end
def is_resettable?(key)
default_value = Setting.get_field(key)[:default]
default_value.present? && (default_value != Setting.send(key))
end
end
end

View File

@ -1,4 +1,5 @@
require "rqrcode" require "rqrcode"
require "lnurl"
class Services::LightningController < ApplicationController class Services::LightningController < ApplicationController
before_action :authenticate_user! before_action :authenticate_user!
@ -8,9 +9,56 @@ class Services::LightningController < ApplicationController
def index def index
@wallet_url = "lndhub://#{current_user.ln_account}:#{current_user.ln_password}@#{ENV['LNDHUB_PUBLIC_URL']}" @wallet_url = "lndhub://#{current_user.ln_account}:#{current_user.ln_password}@#{ENV['LNDHUB_PUBLIC_URL']}"
initialize_lndhub_qr_code
end
qrcode = RQRCode::QRCode.new(@wallet_url) def transactions
@svg = qrcode.as_svg( @transactions = fetch_transactions
end
def qr_lnurlp
lnurlp_url = "https://kosmos.org/.well-known/lnurlp/#{current_user.cn}"
lnurlp_bech32 = Lnurl.new(lnurlp_url).to_bech32
qr_code = RQRCode::QRCode.new("lightning:" + lnurlp_bech32)
respond_to do |format|
format.svg do
qr_svg = qr_code.as_svg(
color: "000",
shape_rendering: "crispEdges",
module_size: 6,
standalone: true,
use_path: true,
svg_attributes: {
class: 'inline-block'
}
)
send_data(
qr_svg,
filename: "bitcoin-lightning-#{current_user.address}.svg",
type: "image/svg+xml"
)
end
format.png do
qr_png = qr_code.as_png(
fill: "white",
color: "black",
size: 1024,
)
send_data(
qr_png,
filename: "bitcoin-lightning-#{current_user.address}.png",
type: "image/png"
)
end
end
end
private
def initialize_lndhub_qr_code
qr_code = RQRCode::QRCode.new(@wallet_url)
@lndhub_qr_svg = qr_code.as_svg(
color: "000", color: "000",
shape_rendering: "crispEdges", shape_rendering: "crispEdges",
module_size: 6, module_size: 6,
@ -22,12 +70,6 @@ class Services::LightningController < ApplicationController
) )
end end
def transactions
@transactions = fetch_transactions
end
private
def authenticate_with_lndhub(options={}) def authenticate_with_lndhub(options={})
if session[:ln_auth_token].present? && !options[:force_reauth] if session[:ln_auth_token].present? && !options[:force_reauth]
@ln_auth_token = session[:ln_auth_token] @ln_auth_token = session[:ln_auth_token]

View File

@ -0,0 +1,10 @@
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = [ "resetButton" ]
resetField () {
const inputEl = this.element.querySelector('input')
inputEl.value = inputEl.dataset.defaultValue
}
}

View File

@ -29,6 +29,7 @@ class Setting < RailsSettings::Base
field :xmpp_default_rooms, type: :array, default: [] field :xmpp_default_rooms, type: :array, default: []
field :xmpp_autojoin_default_rooms, type: :boolean, default: false field :xmpp_autojoin_default_rooms, type: :boolean, default: false
field :xmpp_notifications_from_address, type: :string, default: primary_domain
# #
# Sentry # Sentry
@ -41,13 +42,13 @@ class Setting < RailsSettings::Base
# Discourse # Discourse
# #
field :discourse_public_url, type: :string, readonly: true, field :discourse_public_url, type: :string,
default: ENV["DISCOURSE_PUBLIC_URL"].presence default: ENV["DISCOURSE_PUBLIC_URL"].presence
field :discourse_enabled, type: :boolean, field :discourse_enabled, type: :boolean,
default: (ENV["DISCOURSE_PUBLIC_URL"].present?.to_s || false) default: (ENV["DISCOURSE_PUBLIC_URL"].present?.to_s || false)
field :discourse_connect_secret, type: :string, readonly: true, field :discourse_connect_secret, type: :string,
default: ENV["DISCOURSE_CONNECT_SECRET"].presence default: ENV["DISCOURSE_CONNECT_SECRET"].presence
# #
@ -57,10 +58,10 @@ class Setting < RailsSettings::Base
field :ejabberd_enabled, type: :boolean, field :ejabberd_enabled, type: :boolean,
default: (ENV["EJABBERD_API_URL"].present?.to_s || false) default: (ENV["EJABBERD_API_URL"].present?.to_s || false)
field :ejabberd_api_url, type: :string, readonly: true, field :ejabberd_api_url, type: :string,
default: ENV["EJABBERD_API_URL"].presence default: ENV["EJABBERD_API_URL"].presence
field :ejabberd_admin_url, type: :string, readonly: true, field :ejabberd_admin_url, type: :string,
default: ENV["EJABBERD_ADMIN_URL"].presence default: ENV["EJABBERD_ADMIN_URL"].presence
field :ejabberd_buddy_roster, type: :string, field :ejabberd_buddy_roster, type: :string,
@ -70,7 +71,7 @@ class Setting < RailsSettings::Base
# Gitea # Gitea
# #
field :gitea_public_url, type: :string, readonly: true, field :gitea_public_url, type: :string,
default: ENV["GITEA_PUBLIC_URL"].presence default: ENV["GITEA_PUBLIC_URL"].presence
field :gitea_enabled, type: :boolean, field :gitea_enabled, type: :boolean,
@ -80,7 +81,7 @@ class Setting < RailsSettings::Base
# Lightning Network # Lightning Network
# #
field :lndhub_api_url, type: :string, readonly: true, field :lndhub_api_url, type: :string,
default: ENV["LNDHUB_API_URL"].presence default: ENV["LNDHUB_API_URL"].presence
field :lndhub_enabled, type: :boolean, field :lndhub_enabled, type: :boolean,
@ -89,7 +90,7 @@ class Setting < RailsSettings::Base
field :lndhub_admin_enabled, type: :boolean, field :lndhub_admin_enabled, type: :boolean,
default: (ENV["LNDHUB_ADMIN_UI"] || false) default: (ENV["LNDHUB_ADMIN_UI"] || false)
field :lndhub_public_key, type: :string, readonly: true, field :lndhub_public_key, type: :string,
default: (ENV["LNDHUB_PUBLIC_KEY"] || "") default: (ENV["LNDHUB_PUBLIC_KEY"] || "")
field :lndhub_keysend_enabled, type: :boolean, field :lndhub_keysend_enabled, type: :boolean,
@ -99,7 +100,7 @@ class Setting < RailsSettings::Base
# Mastodon # Mastodon
# #
field :mastodon_public_url, type: :string, readonly: true, field :mastodon_public_url, type: :string,
default: ENV["MASTODON_PUBLIC_URL"].presence default: ENV["MASTODON_PUBLIC_URL"].presence
field :mastodon_enabled, type: :boolean, field :mastodon_enabled, type: :boolean,
@ -109,7 +110,7 @@ class Setting < RailsSettings::Base
# MediaWiki # MediaWiki
# #
field :mediawiki_public_url, type: :string, readonly: true, field :mediawiki_public_url, type: :string,
default: ENV["MEDIAWIKI_PUBLIC_URL"].presence default: ENV["MEDIAWIKI_PUBLIC_URL"].presence
field :mediawiki_enabled, type: :boolean, field :mediawiki_enabled, type: :boolean,

View File

@ -8,16 +8,15 @@
description: "Discourse configuration present and features enabled" description: "Discourse configuration present and features enabled"
) %> ) %>
<% if Setting.discourse_enabled? %> <% if Setting.discourse_enabled? %>
<%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> <%= render FormElements::FieldsetResettableSettingComponent.new(
<%= f.text_field :discourse_public_url, key: :discourse_public_url,
value: Setting.discourse_public_url, title: "Public URL"
class: "w-full", disabled: true %> ) %>
<% end %> <%= render FormElements::FieldsetResettableSettingComponent.new(
<%= render FormElements::FieldsetComponent.new(title: "Connect secret") do %> key: :discourse_connect_secret,
<%= f.password_field :discourse_connect_secret, type: :password,
value: Setting.discourse_connect_secret, title: "Connect secret"
class: "w-full", disabled: true %> ) %>
<% end %>
<% end %> <% end %>
</ul> </ul>
<% if Setting.discourse_enabled? %> <% if Setting.discourse_enabled? %>

View File

@ -8,16 +8,14 @@
description: "ejabberd configuration present and features enabled" description: "ejabberd configuration present and features enabled"
) %> ) %>
<% if Setting.ejabberd_enabled? %> <% if Setting.ejabberd_enabled? %>
<%= render FormElements::FieldsetComponent.new(title: "API URL") do %> <%= render FormElements::FieldsetResettableSettingComponent.new(
<%= f.text_field :ejabberd_api_url, key: :ejabberd_api_url,
value: Setting.ejabberd_api_url, title: "API URL"
class: "w-full", disabled: true %> ) %>
<% end %> <%= render FormElements::FieldsetResettableSettingComponent.new(
<%= render FormElements::FieldsetComponent.new(title: "Admin URL") do %> key: :ejabberd_admin_url,
<%= f.text_field :ejabberd_admin_url, title: "Admin URL"
value: Setting.ejabberd_admin_url, ) %>
class: "w-full", disabled: true %>
<% end %>
</ul> </ul>
<h3 class="mt-10">User default settings</h3> <h3 class="mt-10">User default settings</h3>
<ul role="list"> <ul role="list">
@ -37,12 +35,24 @@
title: "Auto-join default rooms", title: "Auto-join default rooms",
description: "Automatically join above default rooms in chat clients" description: "Automatically join above default rooms in chat clients"
) %> ) %>
<%= render FormElements::FieldsetComponent.new( <%= render FormElements::FieldsetResettableSettingComponent.new(
key: :ejabberd_buddy_roster,
title: "Contact roster name", title: "Contact roster name",
description: "Used when exchanging contacts after signup from invitation" description: "Used when exchanging contacts after signup from invitation"
) %>
</ul>
<h3 class="mt-10">Notifications</h3>
<ul role="list">
<%= render FormElements::FieldsetComponent.new(
title: "From address",
description: "Address (JID) of the account notifications are sent from",
resettable: Setting.get_field(:xmpp_notifications_from_address)[:default] != Setting.xmpp_notifications_from_address
) do %> ) do %>
<%= f.text_field :ejabberd_buddy_roster, <%= f.text_field :xmpp_notifications_from_address,
value: Setting.ejabberd_buddy_roster, value: Setting.xmpp_notifications_from_address,
data: {
:'default-value' => Setting.get_field(:xmpp_notifications_from_address)[:default]
},
class: "w-full" %> class: "w-full" %>
<% end %> <% end %>
<% end %> <% end %>

View File

@ -8,10 +8,9 @@
description: "Gitea configuration present and features enabled" description: "Gitea configuration present and features enabled"
) %> ) %>
<% if Setting.gitea_enabled? %> <% if Setting.gitea_enabled? %>
<%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> <%= render FormElements::FieldsetResettableSettingComponent.new(
<%= f.text_field :gitea_public_url, key: :gitea_public_url,
value: Setting.gitea_public_url, title: "Public URL"
class: "w-full", disabled: true %> ) %>
<% end %>
<% end %> <% end %>
</ul> </ul>

View File

@ -8,11 +8,10 @@
description: "LNDHub configuration present and wallet features enabled" description: "LNDHub configuration present and wallet features enabled"
) %> ) %>
<% if Setting.lndhub_enabled? %> <% if Setting.lndhub_enabled? %>
<%= render FormElements::FieldsetComponent.new(title: "API URL") do %> <%= render FormElements::FieldsetResettableSettingComponent.new(
<%= f.text_field :lndhub_api_url, key: :lndhub_api_url,
value: Setting.lndhub_api_url, title: "API URL"
class: "w-full", disabled: true %> ) %>
<% end %>
<% end %> <% end %>
<%= render FormElements::FieldsetToggleComponent.new( <%= render FormElements::FieldsetToggleComponent.new(
form: f, form: f,
@ -29,10 +28,10 @@
description: "Allow users to receive invoice-less payments to their Lightning Address" description: "Allow users to receive invoice-less payments to their Lightning Address"
) %> ) %>
<% if Setting.lndhub_keysend_enabled? %> <% if Setting.lndhub_keysend_enabled? %>
<%= render FormElements::FieldsetComponent.new(title: "Public key", description: "The public key of the Lightning node used by LNDHub") do %> <%= render FormElements::FieldsetResettableSettingComponent.new(
<%= f.text_field :lndhub_public_key, key: :lndhub_public_key,
value: Setting.lndhub_public_key, title: "Public key",
class: "w-full", disabled: true %> description: "The public key of the Lightning node used by LNDHub"
<% end %> ) %>
<% end %> <% end %>
</ul> </ul>

View File

@ -8,10 +8,9 @@
description: "Mastodon configuration present and features enabled" description: "Mastodon configuration present and features enabled"
) %> ) %>
<% if Setting.mastodon_enabled? %> <% if Setting.mastodon_enabled? %>
<%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> <%= render FormElements::FieldsetResettableSettingComponent.new(
<%= f.text_field :mastodon_public_url, key: :mastodon_public_url,
value: Setting.mastodon_public_url, title: "Public URL"
class: "w-full", disabled: true %> ) %>
<% end %>
<% end %> <% end %>
</ul> </ul>

View File

@ -8,10 +8,9 @@
description: "MediaWiki configuration present and features enabled" description: "MediaWiki configuration present and features enabled"
) %> ) %>
<% if Setting.mediawiki_enabled? %> <% if Setting.mediawiki_enabled? %>
<%= render FormElements::FieldsetComponent.new(title: "Public URL") do %> <%= render FormElements::FieldsetResettableSettingComponent.new(
<%= f.text_field :mediawiki_public_url, key: :mediawiki_public_url,
value: Setting.mediawiki_public_url, title: "Public URL"
class: "w-full", disabled: true %> ) %>
<% end %>
<% end %> <% end %>
</ul> </ul>

View File

@ -1,4 +1,5 @@
<h3>RemoteStorage</h3> <h3>RemoteStorage</h3>
<p class="text-red-600 mb-8">Feature currently in development.</p>
<ul role="list"> <ul role="list">
<%= render FormElements::FieldsetToggleComponent.new( <%= render FormElements::FieldsetToggleComponent.new(
form: f, form: f,
@ -8,10 +9,9 @@
description: "RemoteStorage configuration present and features enabled" description: "RemoteStorage configuration present and features enabled"
) %> ) %>
<% if Setting.remotestorage_enabled? %> <% if Setting.remotestorage_enabled? %>
<%= render FormElements::FieldsetComponent.new(title: "Storage URL") do %> <%= render FormElements::FieldsetResettableSettingComponent.new(
<%= f.text_field :rs_storage_url, key: :rs_storage_url,
value: Setting.rs_storage_url, title: "Storage URL"
class: "w-full", disabled: true %> ) %>
<% end %>
<% end %> <% end %>
</ul> </ul>

View File

@ -7,13 +7,25 @@
<section> <section>
<h3>Lightning Address</h3> <h3>Lightning Address</h3>
<p> <p class="mb-6">
Your Kosmos user address is also a Your Kosmos user address is also a
<a class="ks-text-link" href="https://lightningaddress.com/" target="_blank">Lightning Address</a>! <a class="ks-text-link" href="https://lightningaddress.com/" target="_blank">Lightning Address</a>!
The easiest way to receive sats is by just giving out your address: The easiest way to receive sats is by just giving out your address:
</p> </p>
<p> <p data-controller="clipboard" class="flex gap-1 sm:w-2/5">
<strong><%= current_user.address %></strong> <input type="text" id="user_address" class="grow"
value=<%= current_user.address %> disabled="disabled"
data-clipboard-target="source" />
<button id="copy-user-address" class="btn-md btn-icon btn-blue shrink-0"
data-clipboard-target="trigger" data-action="clipboard#copy"
title="Copy to clipboard">
<span class="content-initial">
<%= render partial: "icons/copy", locals: { custom_class: "text-white h-4 w-4 inline" } %>
</span>
<span class="content-active hidden">
<%= render partial: "icons/check", locals: { custom_class: "text-white h-4 w-4 inline" } %>
</span>
</button>
</p> </p>
</section> </section>
@ -39,7 +51,7 @@
<button id="hide-setup-code" class="hidden btn-md btn-blue w-full sm:w-auto">Hide setup QR code</button> <button id="hide-setup-code" class="hidden btn-md btn-blue w-full sm:w-auto">Hide setup QR code</button>
</p> </p>
<p id="setup-code" class="hidden my-10 w-full text-center"> <p id="setup-code" class="hidden my-10 w-full text-center">
<%= raw @svg %> <%= raw @lndhub_qr_svg %>
</p> </p>
</section> </section>
@ -88,6 +100,24 @@
</p> </p>
</div> </div>
</section> </section>
<section class="mb-12">
<h3>QR Code for Donations/Tips</h3>
<p>
You can print out or publish a QR code for people to scan with their
wallet apps, so they can send you sats without a direct personal
interaction (for example at a concert, or on your website).
</p>
<p class="my-6 text-center md:text-left">
<%= link_to "Download SVG file",
qr_lnurlp_services_lightning_index_path(format: "svg"),
class: "btn-md btn-blue w-full sm:w-auto"%>
<span class="mx-2 my-2 md:my-0 block md:inline">or</span>
<%= link_to "Download PNG file",
qr_lnurlp_services_lightning_index_path(format: "png"),
class: "btn-md btn-blue w-full sm:w-auto"%>
</p>
</section>
<% end %> <% end %>
<script type="text/javascript"> <script type="text/javascript">

View File

@ -24,6 +24,7 @@ Rails.application.routes.draw do
resources :lightning, only: [:index] do resources :lightning, only: [:index] do
collection do collection do
get 'transactions' get 'transactions'
get 'qr_lnurlp'
end end
end end
end end

View File

@ -12,57 +12,60 @@ services:
DS_DM_PASSWORD: passthebutter DS_DM_PASSWORD: passthebutter
SUFFIX_NAME: "dc=kosmos,dc=org" SUFFIX_NAME: "dc=kosmos,dc=org"
# redis: redis:
# restart: always restart: always
# image: redis:7-alpine image: redis:7-alpine
# networks: networks:
# - internal_network - internal_network
# healthcheck: healthcheck:
# test: ['CMD', 'redis-cli', 'ping'] test: ['CMD', 'redis-cli', 'ping']
# volumes: volumes:
# - ./tmp/redis:/data - ./tmp/redis:/data
# web: web:
# build: . build: .
# tty: true tty: true
# command: bash -c "rm -f /akkounts/tmp/pids/server.pid; bin/dev" command: bash -c "rm -f /akkounts/tmp/pids/server.pid; bin/dev"
# volumes: volumes:
# - .:/akkounts - .:/akkounts
# networks: - /akkounts/node_modules
# - external_network networks:
# - internal_network - external_network
# ports: - internal_network
# - "3000:3000" ports:
# environment: - "3000:3000"
# RAILS_ENV: development environment:
# REDIS_URL: redis://redis:6379/0 RAILS_ENV: development
# LDAP_HOST: ldap PRIMARY_DOMAIN: kosmos.org
# LDAP_PORT: 3389 REDIS_URL: redis://redis:6379/0
# LDAP_ADMIN_PASSWORD: passthebutter LDAP_HOST: ldap
# LDAP_USE_TLS: "false" LDAP_PORT: 3389
# depends_on: LDAP_ADMIN_PASSWORD: passthebutter
# - ldap LDAP_USE_TLS: "false"
# - redis depends_on:
- ldap
- redis
# sidekiq: sidekiq:
# build: . build: .
# command: bash -c "bundle exec sidekiq -C config/sidekiq.yml" command: bash -c "bundle exec sidekiq -C config/sidekiq.yml"
# volumes: volumes:
# - .:/akkounts - .:/akkounts
# networks: networks:
# - internal_network - internal_network
# environment: environment:
# RAILS_ENV: development RAILS_ENV: development
# REDIS_URL: redis://redis:6379/0 PRIMARY_DOMAIN: kosmos.org
# LDAP_HOST: ldap REDIS_URL: redis://redis:6379/0
# LDAP_PORT: 3389 LDAP_HOST: ldap
# LDAP_ADMIN_PASSWORD: passthebutter LDAP_PORT: 3389
# LDAP_USE_TLS: "false" LDAP_ADMIN_PASSWORD: passthebutter
# LAUNCHY_DRY_RUN: true LDAP_USE_TLS: "false"
# BROWSER: /dev/null LAUNCHY_DRY_RUN: true
# depends_on: BROWSER: /dev/null
# - ldap depends_on:
# - redis - ldap
- redis
# phpldapadmin: # phpldapadmin:
# image: osixia/phpldapadmin:0.9.0 # image: osixia/phpldapadmin:0.9.0

View File

@ -11,7 +11,7 @@
"postcss-preset-env": "^7.8.3", "postcss-preset-env": "^7.8.3",
"tailwindcss": "^3.2.4" "tailwindcss": "^3.2.4"
}, },
"version": "0.6.0", "version": "0.7.0",
"scripts": { "scripts": {
"build:css:tailwind": "tailwindcss --postcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css", "build:css:tailwind": "tailwindcss --postcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css",
"build:css": "yarn run build:css:tailwind" "build:css": "yarn run build:css:tailwind"

View File

@ -26,16 +26,14 @@ RSpec.describe 'Admin/global settings', type: :feature do
expect(current_url).to eq(admin_settings_services_url(params: { s: "discourse" })) expect(current_url).to eq(admin_settings_services_url(params: { s: "discourse" }))
end end
scenario "View ejabberd settings" do scenario "View service settings" do
visit admin_settings_services_path(params: { s: "ejabberd" }) visit admin_settings_services_path(params: { s: "ejabberd" })
expect(page).to have_content("Enable ejabberd integration") expect(page).to have_content("Enable ejabberd integration")
expect(page).to have_field("API URL", expect(page).to have_field("API URL", with: "http://xmpp.example.com/api")
with: "http://xmpp.example.com/api",
disabled: true)
end end
scenario "Disable ejabberd integration" do scenario "Disable a service integration" do
visit admin_settings_services_path(params: { s: "ejabberd" }) visit admin_settings_services_path(params: { s: "ejabberd" })
expect(page).to have_checked_field("setting[ejabberd_enabled]") expect(page).to have_checked_field("setting[ejabberd_enabled]")
@ -47,25 +45,15 @@ RSpec.describe 'Admin/global settings', type: :feature do
expect(page).to_not have_field("API URL", disabled: true) expect(page).to_not have_field("API URL", disabled: true)
end end
scenario "View remoteStorage settings" do scenario "Resettable fields" do
visit admin_settings_services_path(params: { s: "remotestorage" }) visit admin_settings_services_path(params: { s: "ejabberd" })
expect(page).to have_field("API URL", with: "http://xmpp.example.com/api")
expect(page).to_not have_css('input#setting_ejabberd_api_url+button')
expect(page).to have_content("Enable RemoteStorage integration") Setting.ejabberd_api_url = "http://example.com/foo"
expect(page).to have_field("Storage URL", visit admin_settings_services_path(params: { s: "ejabberd" })
with: "https://storage.kosmos.org", expect(page).to have_field("API URL", with: "http://example.com/foo")
disabled: true) expect(page).to have_css('input#setting_ejabberd_api_url+button')
end
scenario "Disable remoteStorage integration" do
visit admin_settings_services_path(params: { s: "remotestorage" })
expect(page).to have_checked_field("setting[remotestorage_enabled]")
uncheck "setting[remotestorage_enabled]"
click_button "Save"
expect(current_url).to eq(admin_settings_services_url(params: { s: "remotestorage" }))
expect(page).to_not have_checked_field("setting[remotestorage_enabled]")
expect(page).to_not have_field("Storage URL", disabled: true)
end end
end end
end end