Improve docs, design source and config examples. Refs #263

This commit is contained in:
Pavel Chipiga 2012-04-05 00:36:41 +03:00
parent 916cee3bb3
commit 9fed8ed274
52 changed files with 565 additions and 469 deletions

View File

@ -1,323 +0,0 @@
КРАТКОЕ ОПИСАНИЕ ACL
====================
Предназначение
--------------
ACL предназначена для контроля прав пользователя на выполнение действий в
системе и доступа к моделям по областям видимости.
Решаемые задачи
---------------
* Проверка наличия у пользователя прав для выполнения метода контроллера;
* Прозрачная фильтрация моделей для исключения невидимых для пользователя
записей.
Возможности
-----------
* Неограниченное количество моделей, над которыми могут выполняться
действия (`target`);
* Неограниченное количество моделей, которые могут выполнять действия над
другими (`acter`);
* Геренатор прав основывающийся на структуре приложения (см. далее);
* Неограниченное количество ролей, которые могут назначаться для `acter` и
содержать любую комбинацию прав и доступных видимостей;
* Объединение прав `acter`-ов на глубину одной модели (см. далее);
* Разграничение назначения ролей по классам (не завершено, на данный
момент не критично);
* Разграничение ролей на глобальные и локальные (см. далее).
Типы моделей, с которыми взаимодействует ACL
--------------------------------------------
* __ActerModel__ -- модель, которая может выполнять действия, разрешенные
ролями, над другими моделями;
* __TargetTarget__ -- модель, над которой могут выполняться действия,
разрешенные ролями.
__ActerModel__ может иметь глобальную роль, которая определяет возможность
выполнения действий без привязки к конкретному экземпляру __TargetModel__ и
неограниченное количество прав по отношению к конкретному экземпляру
__TargetModel__.
__TODO__: *Реализовать дополнение необходимым функционалом моделей, выбранных
в качестве __ActerModel__ или __TargetModel__ при декларировании их роли в
системе*
Схема взаимодействия объектов ACL
---------------------------------
Функционал ACL реализуется путем взаимодействия моделей `Right, Role, Relation`,
реализующих основной функционал и особых моделей проекта, обозначенных на схеме
как `ActerModel` и `TargetModel`.
Экземпляры __ActerModel__ и __TargetModel__ связываются посредством модели
`Relation`, через которую экземпляр __ActerModel__ получает неограниченное
количество ролей по отношению к экземпляру __TargetModel__.
### Схема связей моделей:
--------------
| ActerModel |
/ --------------
--------- -------- |
| Right | | Role | V
--------- -------- ------------
... <= ... <= | Relation |
--------- -------- ------------
| Right | | Role | |
--------- -------- V
---------------
| TargetModel |
---------------
* Обозначения: <= -- Связь с несколькими моделями
<-,/,| -- Связь с одной моделью
Генератор прав
--------------
Генератор ролей является Rake-task-ом и запускается командой
`rake rights:generate`.
Желательно запускать после добавления нового метода в контроллер для того,
чтобы на этот метод в системе появилось право.
Загрузка ролей из дампа
-----------------------
Загрузку ролей из заранее подготовленного дампа можно произвести двумя
способами:
* В консоли, используя Rake task `rake roles:load`, который загрузит в базу
роли, описанные в `config/roles.yml`
* Через Web-интерфейс, на странице `/roles`, если у пользователя есть
соответствующие права. Для загрузки через Web-интерфейс необходимо выбрать
файл в поле выбора вверху страницы и нажать __Загрузить__.
Получение дампа ролей
---------------------
Дамп ролей может получить пользователь, имеющий на это права, зайдя на страницу
`roles` и нажав кнопку `Скачать в YML`.
Задание областей видимости моделей
----------------------------------
*Этот функционал скорее всего будет изменяться*
Если модель должна иметь несколько областей видимости, нужно сделать следующее:
* Добавить в модель константу `VISIBILITIES`, в которой задать названия областей
видимости;
* Добавить к таблице моделей поле `visibility:text`;
* Добавить `attr_accessible :visibility` в модель;
* Создать `scope :by_visibility`, принимающий аргументом массив областей
видимости.
После выполнения этих действий на странице редактирования роли появится поле
выбора областей видимости для этой модели.
### Пример:
model VisibilitiesExample < ActiveRecord::Base
VISIBILITIES = ['open', 'hidden', 'open_for_admins']
attr_accessible :visibility
scope :by_visibility, lambda {|v| {:conditions => ['visibility in (?)', v]}}
end
*Назначение методов описано в API*
Задание типа модели
-------------------
*Этот функционал скорее всего будет изменяться*
Если модель должна иметь возможность быть связанной с другими с использованием
ролей, необходимо произвести следующие действия:
* Добавить в модель декларацию `relationable`, с аргументом `:as`, который
может принимать заначения из `[:object, :target]`. Если модель будет
__acter__-ом, передается `:object`, иначе `:target`
Пример: `relationable :as => :object`
* Добавить в модель связь `belongs_to :global_role, :class_name => 'Role'`
* Добавить в модель связь с моделью `Relation`
* Если модель -- __acter__ и она должна использовать как свои роли, так и
роли из другой модели, необходимо добавить декларацию `inherit_rights_from`
которой аргументом присвоить имя/имена связей с моделями, из которых должны
браться роли.
### Примеры:
* Модель, являющаяся __acter__:
class ActerModel < ActiveRecord::Base
relationable :as => :object
belongs_to :global_role, :class_name => 'Role'
has_many :targets, :as => :object, :class_name => 'Relation'
end
* Модель, являющаяся __acter__ и наследующая права другой модели:
class ActerWithInheritableRolesModel < ActiveRecord::Base
relationable :as => :object
ingerit_rights_from :another_acter_model
has_many :another_acters_models
belongs_to :global_role, :class_name => 'Role'
has_many :targets, :as => :object, :class_name => 'Relation'
end
* Модель, являющаяся __target__:
class TargetModel < ActiveRecord::Base
relationable :as => :target
has_many :objects, :as => :target, :class_name => 'Relation'
end
* Модель, являющаяся и __acter__, и __target__:
class ActerAndTargetModel < ActiveRecord::Base
relationable :as => :object
relationable :as => :target
belongs_to :global_role, :class_name => 'Role'
has_many :targets, :as => :object, :class_name => 'Relation'
has_many :objects, :as => :target, :class_name => 'Relation'
end
*Назначение методов описано в API*
Использование ACL в контроллере
-------------------------------
Если необходимо ограничить доступ ко всем методам контроллера по глобальной
роли пользователя вне зависимости от текущей модели, необходимо установить
`before_filter :check_global_rights`.
В случае, если у пользователя нет прав для выполнения текущего действия, он
будет переотправлен на предыдущую страницу.
Если необходимо проверить, может ли пользователь выполнить конкретное действие,
необходимо в начале этого метода вызвать метод `can_perform?`. Если методу
передан параметр, являющийся экземпляром класса __TargetModel__, метод возвратит
`true`, если одна или несколько ролей пользователя над этой моделью позволяет
ему выполнить может выполнить действие и `false` в противном случае. Если
необязательный параметр опущен, или в качестве параметра передано `:system`,
учитываются только глобальные роли.
### Примеры
* Контроллер, некоторые методы которого доступны для всех:
class StuffController < ApplicationController
def index # доступ у всех
...
end
def show # 'Что-то полезное' выполнится только у тех, чьи роли над
# @data позволяют выполнить конкретное действие.
@data = Stuff.find(params[:id])
if can_perform? @data
#что-то полезное
else
# сообщаем пользователю, что он не может выполнить действие
end
end
def create # 'Что-то полезное' выполнится только у тех, чьи
# глобальные роли позволяют выполнить метод
if can_perform?
# что-то полезное
else
# сообщаем пользователю, что он не может выполнить действие
end
end
end
* Контроллер, доступ к методам которого возможен только при наличии необходимых
прав в глобальных ролях:
class StuffController < ApplicationController
before_filter :check_global_rights # разрешаем доступ только тем,
# чьи роли это позволяют.
def index # доступ только у тех, кому это позволяет глобальная роль
...
end
def show # 'Что-то полезное' выполнится только у тех, чьи роли
# над @data это позволяют
@data = Stuff.find(params[:id])
if can_perform? @data
#что-то полезное
else
# сообщаем пользователю, что он не может выполнить действие
end
end
end
Использование ACL во view
-------------------------
Используется метод `can_perform?` модели, для которой нужно проверить права
доступа. Обычно этой моделью является `current_user`.
### Примеры:
* Проверка на возможность выполнения глобального действия:
-if current_user.can_perform?('some_controller', 'some_aciton')
%a{:href => controller_action_path}= Some description
* Проверка на возможность выполнения действия над текущей моделью:
-if current_user.can_perform?('some_controller', 'some_aciton', @data)
%a{:href => controller_action_path(@data)}= Some description
API для работы с ACL
--------------------
*Этот функционал скорее всего будет изменяться*
### Методы потомков `ActiveRecord::Base`
*  Методы классов:
- `relationable` -- устанавливает, кем является модель (acter/target)
- `relationable?` -- может ли иметь связь с ролью/ролями с другими
- `relation_acters` -- список моделей, которые могут иметь роли
по отношению к другим (след. метод)
- `relation_targets` -- список моделей, над которыми могут совершаться
действия
- `relation_acter? (model)`, `relation_target? (model)` -- является ли
тем или другим
  - `inherit_rights_from (:relation_name | [:relation_names])` -- права из
каких связанных моделей наследовать
  - `visible_to (model)` -- все видимые для модели записи, может
включаться в цепочку (например, для paginate)
* Методы инстансов:
- `add_role_to(acter, role)` -- привязать acter-а с ролью к текущей записи
- `add_role_on(target, role)` -- привязать текущую модель с ролью
- `roles_to(object)` -- если object == :system, возвращает глобальные роли
текущей записи, если передана запись -- то роли текущей модели над записью
- `rights_to(object)` -- аргументы те же, но возвращается список прав,
собранный из всех ролей
- `right_to(controller_name, action)` -- возвращает запись с правом на
выполнение действия action в контроллере c именем `controller_name`
- `can_perform? (controller_name, action, target = :system)` -- показывает,
может ли текущая модель выполнить действие контроллера над целью
### Методы потомков `ActiveController::Base`
*Возможно, будут вынесены в хелпер для универсализации системы*
- `can_perform? (target = :system)` -- может ли `current_user` выполнить
текущее действие
- `check_global_access` -- делает редирект назад или на главную, если
пользователь вообще не может совершить текущее действие
- `roles_to(object)` -- возвращает список ролей `current_user`-а по отношению
к объекту
- `rights_to(object)` -- возвращает список прав `current_user`-а по отношению
к объекту

View File

@ -23,9 +23,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -43,9 +46,7 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -22,9 +22,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -42,9 +45,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -24,9 +24,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -44,9 +47,7 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -18,9 +18,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -38,9 +41,7 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -20,9 +20,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -40,9 +43,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -23,9 +23,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -43,9 +46,7 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -18,9 +18,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -38,9 +41,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -17,9 +17,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -37,9 +40,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -22,9 +22,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -42,9 +45,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -17,9 +17,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -37,9 +40,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -17,6 +17,9 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first active">Главная</a>
@ -37,9 +40,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -22,9 +22,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -42,9 +45,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -24,9 +24,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -44,9 +47,7 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -21,9 +21,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -41,9 +44,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -18,9 +18,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -38,9 +41,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -27,9 +27,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -47,9 +50,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -18,9 +18,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -38,9 +41,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -27,9 +27,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -47,9 +50,7 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -21,9 +21,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -41,9 +44,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->
@ -100,8 +100,14 @@
<th class="th3">Роль в проекте</th>
<th class="th4">Покинуть проект</th>
</tr>
</thead>
<tbody>
<tr class="search">
<td colspan="4">
<input type="text" value="Найти проект..." class="gray" onClick="if(this.value=='Найти проект...'){this.value='';this.className='black';}" onblur="if(this.value==''){this.value='Найти проект...';this.className='gray';}" />
</td>
</tr>
<tr id="Row1">
<td><a href="#"><div class="table-sort-left"><img src="pics/unlock.png" alt="unlock"></div><div class="table-sort-right">gsapronov/ROSA-Jabber</div></a></td>
<td class="td2">Проект создан для разработки интернет-пейджера, с простым

View File

@ -18,9 +18,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -38,9 +41,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -20,9 +20,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -40,9 +43,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -20,9 +20,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -40,9 +43,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -20,9 +20,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -40,9 +43,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -17,9 +17,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -37,9 +40,7 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -17,9 +17,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -37,9 +40,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -20,9 +20,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -40,9 +43,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -17,9 +17,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -37,9 +40,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -18,9 +18,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -38,9 +41,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -18,9 +18,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -38,9 +41,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -37,9 +37,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -57,9 +60,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->
@ -137,7 +137,7 @@
<article>
<div class="all">
<div class="desription-top">
<div class="description-top">
<div class="img">
<img src="pics/code.png" alt="pic" />
</div>

View File

@ -37,9 +37,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -57,9 +60,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->
@ -137,7 +137,7 @@
<article>
<div class="all">
<div class="desription-top">
<div class="description-top">
<input class="name" value="git@git.com:snigipini/wacomdrivers.git" />
<div class="role">
чтение и запись

View File

@ -17,9 +17,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first active">Главная</a>
<a href="#" class="active">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -37,9 +40,7 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -23,9 +23,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#">Проекты</a>
@ -43,9 +46,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -137,7 +137,7 @@
</aside>
<!--Right part of page-->
<div class="right">
<div class="desription-top">
<div class="description-top">
<div class="img">
<img src="pics/code.png" alt="pic" />
</div>

View File

@ -18,9 +18,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -38,9 +41,7 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -18,9 +18,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -38,9 +41,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

View File

@ -0,0 +1,217 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Сборочная среда</title>
<script type="text/javascript" src="js/html5shiv.js"></script>
<link rel="stylesheet" type="text/css" href="styles/main.css" />
<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="js/all.js"></script>
<script type='text/javascript' src='js/checkbox-main.js'></script>
</head>
<body>
<div class="wrap columns">
<!--Top block-->
<header>
<div class="left">
</div>
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
</li>
<li>
<a href="#">Группы</a>
</li>
<li>
<a href="#">Мониторинг</a>
</li>
<li>
<a href="#">Платформа</a>
</li>
<li>
<a href="#">Документация</a>
</li>
</ul>
</menu>
<div class="information">
<!--Search-->
<div class="search">
<div class="pic">
</div>
<div class="field">
<input type="text" value="Поиск" class="gray" onClick="if(this.value=='Поиск'){this.value='';this.className='black';}" onblur="if(this.value==''){this.value='Поиск';this.className='gray';}" />
</div>
</div>
<div class="user">
<div class="avatar" onclick="droplist();">
<img src="pics/ava.png" alt="avatar" height="30" />
</div>
<div class="profile" onclick="droplist();">
<a href="#" onclick="droplist();">mikimaus <img src="pics/expand-white.png" alt="ex" /></a>
</div>
</div>
<div class="both">
</div>
<div class="droplist-wrap">
<div class="droplist" id="droplist">
<div class="a"><a href="#">Публичный профиль</a></div>
<div class="a"><a href="#">Настройки</a></div>
<div class="a"><a href="#">Выйти</a></div>
</div>
</div>
</div>
</div>
<div class="right">
</div>
<div class="both">
</div>
</header>
<!--Submenu-->
<div class="sub-menu">
<div class="left">
WacomDrivers
</div>
<nav>
<ul>
<li>
<a href="#">Проект</a>
</li>
<li>
<a href="#">Коммиты</a>
</li>
<li>
<a href="#">Сборки</a>
</li>
<li>
<a href="#">Трекер</a>
</li>
<li>
<a href="#" class="active">Wiki</a>
</li>
<li>
<a href="#">Readme</a>
</li>
<li>
<a href="#">Настройки</a>
</li>
</ul>
</nav>
</div>
<div class="both">
</div>
<!--Page-->
<article>
<!--Left part of page-->
<aside>
<div class="admin-preferences">
<ul>
<li>
<a href="#">Home</a>
</li>
<li class="active">
<a href="#">Pages</a>
</li>
<li>
<a href="#">Wiki history</a>
</li>
<li>
<a href="#">Git access</a>
</li>
</ul>
</div>
</aside>
<!--Right part of page-->
<div class="right">
<div class="left">
<h3>Home</h3>
</div>
<div class="r">
<a class="button" href="#">История</a>
</div>
<div class="both"></div>
<div id='wiki-content'>
<div class='has-footer has-rightbar wrap'>
<div class='gollum-markdown-content' id='wiki-body'>
<div id='template'><p>Lorem ipsum.</p>
<p>Lorem ipsum dolor sit amet.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse sit amet ullamcorper arcu. Cras congue, velit sed sollicitudin dignissim, turpis erat ultrices risus, vitae gravida ligula elit vel urna. Curabitur mattis dapibus rhoncus. Aenean lorem nisi, lacinia sed elementum nec, consectetur ac augue. Quisque vulputate sodales nunc, et imperdiet ante tincidunt eu. Donec velit enim, dapibus at pharetra a, scelerisque ut sapien. Nullam luctus pulvinar dui nec convallis. Nullam viverra nisi nec orci fringilla varius.</p>
</div>
</div>
<div class='gollum-markdown-content' id='wiki-rightbar'>
<p>Это сайдбар.
Это сайдбар.
Это сайдбар.
Это сайдбар.
Это сайдбар.
Это сайдбар.
Это сайдбар.</p>
</div>
<div class='gollum-markdown-content' id='wiki-footer'>
<div id='footer-content'><p>Футер Футер Футер Футер</p></div>
</div>
</div>
</div>
<div id='gollum-footer'>
<p id='last-edit'>
Последним редактировал
<b><a href="/users/14">ironsnake</a></b>
около 19 часов
назад
</p>
</div>
<div class='both'></div>
</div>
<div class="both"></div>
</article>
</div>
<!--Footer-->
<footer>
<ul>
<li>
ROSA Лаб. © 2012 <img src="pics/square.png" alt="_" />
</li>
<li>
<img src="pics/flag.png" alt="rosa" /> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="#">О компании</a> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="#">Контакты</a> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="#">Условия использования</a> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="#">Конфиденциальность</a> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="#">Безопасность</a>
</li>
</ul>
</footer>
</body>
</html>

View File

@ -18,9 +18,12 @@
<div class="middle">
<!--Main menu-->
<menu>
<div class="logo">
<a href="#"><img src="pics/logo-mini.png" alt="Главная" /></a>
</div>
<ul>
<li>
<a href="#" class="first">Главная</a>
<a href="#">Главная</a>
</li>
<li>
<a href="#" class="active">Проекты</a>
@ -38,9 +41,6 @@
<a href="#">Документация</a>
</li>
</ul>
<div class="logo">
<img src="pics/logo-mini.png" alt="logo" />
</div>
</menu>
<div class="information">
<!--Search-->

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
doc/design/pics/file.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
doc/design/pics/group16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 941 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 939 B

BIN
doc/design/pics/group32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
doc/design/pics/user16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 667 B

BIN
doc/design/pics/user16g.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 667 B

BIN
doc/design/pics/user32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 B

BIN
doc/design/pics/user32g.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 B

126
doc/nginx/nginx.conf Normal file
View File

@ -0,0 +1,126 @@
user rosa;
worker_processes 2;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
accept_mutex on;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format ma§in '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay off;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
client_max_body_size 1G;
server_names_hash_bucket_size 64;
include conf.d/rosa_build.conf; # force default ip access
include conf.d/rosa_build_*;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}

61
doc/nginx/rosa_build.conf Normal file
View File

@ -0,0 +1,61 @@
upstream rosa_build_backend {
# server 127.0.0.1:8080;
server unix:/tmp/rosa_build_unicorn.sock;
}
server {
listen 80;
server_name rosa-build.rosalab.ru;
root /srv/rosa_build/current/public;
if ($uri !~ downloads) {
rewrite ^(.*) https://$host$1 permanent;
}
location /downloads {
autoindex on;
}
access_log /srv/rosa_build/shared/log/nginx.access.log;
error_log /srv/rosa_build/shared/log/nginx.error.log;
#rewrite ^/downloads/(.*) http://$host/downloads/$1 break;
}
server {
listen 443 default ssl;
server_name 195.19.77.242;
root /srv/rosa_build/current/public;
ssl on;
ssl_certificate /etc/ssl/rosalinux.crt;
ssl_certificate_key /etc/ssl/rosalinux.key;
#ssl_verify_depth 3;
#location /downloads {
#autoindex on;
#}
try_files $uri/index.html $uri.html $uri @myapp;
location @myapp {
proxy_pass http://rosa_build_backend;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 300;
proxy_send_timeout 180;
proxy_redirect off;
}
rewrite ^/downloads/(.*) http://$host/downloads/$1 break;
#access_log /srv/rosa_build/shared/log/nginx.access.log;
#error_log /srv/rosa_build/shared/log/nginx.error.log;
error_page 500 502 503 504 /500.html;
location = /500.html {
root /srv/rosa_build/current/public;
}
}