summaryrefslogtreecommitdiff
path: root/rt/docs
diff options
context:
space:
mode:
Diffstat (limited to 'rt/docs')
-rwxr-xr-xrt/docs/README.docs2
-rw-r--r--rt/docs/Security25
-rwxr-xr-xrt/docs/design_docs/CARS66
-rwxr-xr-xrt/docs/design_docs/TransactionTypes.txt48
-rw-r--r--rt/docs/design_docs/acls206
-rw-r--r--rt/docs/design_docs/basic-definitions.txt54
-rw-r--r--rt/docs/design_docs/cli_spec354
-rw-r--r--rt/docs/design_docs/cvs_integration164
-rw-r--r--rt/docs/design_docs/evil_plans167
-rw-r--r--rt/docs/design_docs/link-definitions.txt143
-rw-r--r--rt/docs/design_docs/local_hacking32
-rwxr-xr-xrt/docs/design_docs/subscription-definitions.txt113
-rw-r--r--rt/docs/design_docs/users14
-rwxr-xr-xrt/docs/rt.gifbin0 -> 8811 bytes
14 files changed, 1388 insertions, 0 deletions
diff --git a/rt/docs/README.docs b/rt/docs/README.docs
new file mode 100755
index 000000000..38866b357
--- /dev/null
+++ b/rt/docs/README.docs
@@ -0,0 +1,2 @@
+Questions about docs should be sent to the RT Documentation Team (rt-docs@fsck.com)
+which is led by Meri.
diff --git a/rt/docs/Security b/rt/docs/Security
new file mode 100644
index 000000000..c9787ac52
--- /dev/null
+++ b/rt/docs/Security
@@ -0,0 +1,25 @@
+RT2 runs setgid to some group (it defaults to 'rt').
+
+rt's configuration file, 'config.pm', is not world readable because it
+contains rt's database password. If a user gets access to this file, he
+can arbitrarily manipulate the RT database. This is bad. You don't want
+this to happen. config.pm is mode 550. No users should be members of
+the 'rt' group unless you want them to be able to obtain your rt password.
+
+If you're running the web interface, you'll need to make sure your webserver
+has access to config.pm. You could do this by letting your webserver's user
+be a member of the 'rt' group. This has the disadvantage of letting
+any mod_perl code on your web server have access to your RT password.
+
+Alternatively, you can run RT2 on its own apache instance bound to a high
+port on 127.0.0.1
+which runs as a non-priviledged user which is a member of the group 'rt'.
+
+Configure your webserver to proxy requests to RT's
+virtual directory to the apache instance you just set up.
+
+TODO: doc the apache configs needed to do this.
+
+The same technique can be used to run multiple RT2 instances on the same host.
+
+
diff --git a/rt/docs/design_docs/CARS b/rt/docs/design_docs/CARS
new file mode 100755
index 000000000..a4d2a78c5
--- /dev/null
+++ b/rt/docs/design_docs/CARS
@@ -0,0 +1,66 @@
+Conditional Automated Request Shuffler
+Initial Design. <jesse@fsck.com> 9 Nov 99
+
+#Try to find out what queue the incoming ticket is in
+#Try to find out the default action for this invocation
+#Read the ticket from STDIN
+#Obtain the actor
+#Obtain the serial # if we have one
+#If the ticket has a ticket-id
+ #if this is a 'comment'
+ #add the current mime objects as a 'comment'
+
+ #if this is 'correspondence'
+ #add the current mime object as 'correspondence'
+
+
+#if this ticket does not yet have a ticket id
+
+ #For now:
+ #Create a new ticket
+
+ #In the distant future
+
+ #load the regexp table matching this queue
+ #check the message agains the regexp table, ordered by precedence
+ #when we get a match
+ #get the ruleset for that regexp from the actions table
+ #evaluate the ruleset in order of precedence.
+ #if we get an 'exit' stop proccesing ALL rulesets
+wpw #if we get a 'forward,' forward it to 'value'.
+
+ #if we get a 'create,' create a request in 'value'
+ #elseif we get a 'map', add this as additional correspondence on ticket 'value'
+
+
+ #if we get an 'associate', associate the ticket number returned from the
+ 'create' or 'map' with the master ticket from 'value'
+
+ #if we get a 'reply',
+ #load the reply template with id 'value'
+ #replace strings in the template
+ #send the template
+
+
+
+
+CREATE TABLE Rules {
+ID int AUTO_INCREMENT,
+Desc varchar(120),
+Regexp varchar(80),
+Precedence int,
+MatchField varchar(20), #Can be a headername or 'any' all header names
+ #end in :
+
+
+CREATE TABLE Actions {
+Rule int,
+Action varchar(20), # Create, Forward, Squelch, Owner, Area, Associate
+Value varchar(20), #queue or email address
+Desc varchar(120)
+}
+
+CREATE TABLE Autoreplies {
+ID int AUTO_INCREMENT,
+Content text
+); \ No newline at end of file
diff --git a/rt/docs/design_docs/TransactionTypes.txt b/rt/docs/design_docs/TransactionTypes.txt
new file mode 100755
index 000000000..942b72371
--- /dev/null
+++ b/rt/docs/design_docs/TransactionTypes.txt
@@ -0,0 +1,48 @@
+This is some loose scrabbling made by TobiX, they might eventually be relevant
+for 2.1.
+
+INTERFACES, in general
+
+should:
+
+- provide the user (client?) with a list of possible actions (methods).
+- let the user execute those actions (methods).
+- Return information to the user/client.
+
+There are two kind of actions/methods:
+
+- Information retrieval
+- Transactions
+
+For the first, I think the best thing is to just provide a lot of
+methods for it in the libraries, and let it be an Interface Design
+Issue what to show and how to show it.
+
+For the second, I think we can win in the long run on having a
+generalized methods for
+
+- listing transaction types.
+- creating & committing transactions.
+
+..with the possibility of just deploying new custom-developed modules
+when new transaction types are needed.
+
+
+$RT::TransactionTypes ...and...
+%RT::TransactionTypes
+ - global object which contains all TransactionTypes
+ - used by all UIs to create menues of possible (user) actions (one TransactionType is a user action)
+
+The UIs should call sth like
+$Ticket->AddTransaction($TransactionName), which should be equivalent
+with i.e. $Ticket->Correspond when $TransactionName is 'Correspond'
+(AUTOLOAD should call the do-sub if exists
+$RT::TransactionTypes{$TransactionName})
+
+The RT::Ticket::AddTransaction will create a new transaction of the
+right TransactionClass (maybe via a sub
+RT::TransactionTypes::NewTransaction). Then $Transaction->do is
+called.
+
+TransactionType->do initializes a new object of the right TransactionClass, and
+
diff --git a/rt/docs/design_docs/acls b/rt/docs/design_docs/acls
new file mode 100644
index 000000000..3b9d8567c
--- /dev/null
+++ b/rt/docs/design_docs/acls
@@ -0,0 +1,206 @@
+$Header: /home/cvs/cvsroot/freeside/rt/docs/design_docs/acls,v 1.1 2002-08-12 06:17:07 ivan Exp $
+
+
+
+# {{{ Requirements
+
+Here's the rough scheme I was thinking of for RT2 acls. Thoughts? I think
+it's a lot more flexible than RT 1.0, but not so crazily complex that
+it will be impossible to implement. One of the "interesting" features
+is the ability to grant acls based on watcher status. This now lives
+in design-docs/acls
+
+ jesse
+
+Who can rights be granted to:
+
+ users whose id is <foo>
+ users who are watchers of type <requestor/cc/admincc> for <queue/ticket> <id>
+ users who are watchers of type <requestor/cc/admincc> for <this ticket / this queue>
+
+
+what scope do these rights apply to
+ queue <id>
+ system
+
+
+What rights can be granted
+ Display Ticket
+ Manipulate Ticket
+ Only users with manipulate ticket level access will see comments
+ Maniplulate Ticket Status
+ Create Ticket
+
+ Admin Queue Watchers
+ Admin Ticket Watchers
+ Admin user accounts
+ Admin scrips
+ Admin scripscopes
+ Admin Queue ACLS
+ Admin System ACLs
+
+# }}}
+
+
+# {{{ Prinicpals These are the entities in your Access Control Element
+#
+
+Principal: What user does this right apply to
+
+ Made up of:
+ PrincipalScope, PrincipalType and PrincipalId
+
+
+ User:
+ Scope: User
+ Type: null
+ Id: A userid or 0
+
+ Owner:
+ Scope: Owner
+ Type: null
+ Id: none
+
+
+ Watchers:
+
+ Scope: Ticket
+ Type: Requestors; Cc; AdminCc
+ Id: A ticket id or 0 for "this ticket"
+
+ Scope: Queue
+ Type: Cc; AdminCc
+ Id: A queue id or 0 for "this queue"
+
+
+# }}}
+
+# {{{ Object: What object does this right apply to
+
+ Object is composed of an ObjectType and an ObjectId
+
+ Type: System
+ Id: NULL
+
+ Type: Queue
+ Id: Integer ref to queue id or 0 for all queues
+
+# }}}
+
+# {{{ Right: (What does this entry give the principal the right to do)
+
+
+
+ For the Object System:
+ System::SetACL
+ System::AdminScrips
+
+ User::Display
+ User::Create
+ User::Destroy
+ User::Modify
+ User::SetPassword
+
+
+
+ For the Object "Queue":
+ Queue::Admin
+ Queue::SetACL
+ Queue::Create
+ Queue::Display
+ Queue::Destroy
+ Queue::ModifyWatchers
+ Ticket::Create
+ Ticket::Destory
+ Ticket::Display
+ Ticket::Update
+ Ticket::UpdateRequestors
+ Ticket::UpdateCc
+ Ticket::UpdateAdminCc
+ Ticket::NotifyWatchers
+
+
+ DEFERRED
+
+ Ticket::SetStatus: (Values)
+ Open
+ Resolved
+ Stalled
+ <null> means any
+
+
+# }}}
+
+
+# {{{ Implementation:
+
+# {{{ SQL Schema
+CREATE TABLE ACL (
+ id int not null primary_key autoincrement,
+ PrinicpalId INT(11),
+ PrincipalType VARCHAR(16),
+ PrincipalScope VARCHAR(16),
+ ObjectType VARCHAR(16),
+ ObjectId INT,
+ Right VARCHAR(16)
+);
+
+# }}}
+
+# {{{ perl implementation of rights searches
+
+sub Principals {
+if (defined $Ticket) {
+ return "($UserPrincipal) OR ($OwnerPrincipal) OR ($WatchersPrincipal)";
+ }
+else {
+ return "($UserPrincipal) OR ($WatchersPrincipal)";
+ }
+}
+
+$Principals = " ($UserPrincipal) OR ($OwnerPrincipal) OR ($WatchersPrincipal)";
+
+$UserPrincipal = " ( ACE.PrincipalScope = 'User') AND
+ ( ACE.PrincipalId = $User OR ACE.PrincipalId = 0)";
+
+$OwnerPrincipal = " ( ACE.PrinciaplScope = 'Owner') AND
+ ( Tickets.Owner = "$User ) AND
+ ( Tickets.Id = $Ticket)";
+
+$WatchersPrincipal = " ( ACE.PrincipalScope = Watchers.Scope ) AND
+ ( ACE.PrincipalType = Watchers.Type ) AND
+ ( ACL.PrincipalId = Watchers.Value ) AND
+ ( Watchers.Owner = $User )";
+
+$QueueObject = "( ACE.ObjectType = 'Queue' and (ACE.ObjectId = $Queue OR ACE.ObjectId = 0)";
+
+$SystemObject = "( ACE.ObjectType = 'System' )";
+
+
+# This select statement would figure out if A user has $Right at the queue level
+
+SELECT ACE.id from ACE, Watchers, Tickets WHERE (
+ $QueueObject
+ AND ( ACE.Right = $Right)
+ AND ($Principals))
+
+# This select statement would figure outif a user has $Right for the "System"
+
+SELECT ACE.id from ACE, Watchers, Tickets WHERE (
+ ($SystemObject) AND ( ACE.Right = $Right ) AND ($Principals))
+
+# }}}
+
+# }}}
+
+# {{{ Examples
+#
+
+# }}}
+
+
+
+Unaddressed issues:
+
+ There needs to be a more refined method for grouping users, such that members of the customer service department
+can't change sysadmins' passwords.
diff --git a/rt/docs/design_docs/basic-definitions.txt b/rt/docs/design_docs/basic-definitions.txt
new file mode 100644
index 000000000..23d2c5748
--- /dev/null
+++ b/rt/docs/design_docs/basic-definitions.txt
@@ -0,0 +1,54 @@
+(todo ... basically, those are untouched from 1.0)
+Ticket
+Queue
+(...more?)
+
+Requestor
+
+ (...definition of a requestor .. blahblah)
+
+ I'm often doing a distinction between "Internal Requestors" and "External
+ Requestors" (see below). The system doesn't make any difference between
+ requestors, but the distinction might be useful to discuss usage patterns,
+ templates and configurations.
+
+
+External Requestor
+
+ Might be a customer or a potential customer. The External Requestor
+ should be treated as a VIP. (S)he shouldn't need to see too much of RT.
+ The support (s)he gets should be as personal as possible. The external
+ requestor might eventually get access to the Web UI, but only to track
+ her/his own requests. If you're not planning to use RT for handling
+ external customers, all your requestors are probably "Internal
+ Requestors".
+
+
+Watcher
+
+ Somebody that are "subscribing" to a queue or a ticket (or something
+ differently). Basicly, somebody watching a queue or a ticket should get
+ all updates by email. A requestor is a (special) watcher.
+
+
+Regular Watcher
+
+ People within the same organization, people that have read access to whole
+ queues.
+
+ I consider "Regular Watchers" as well as "Internal Requestors" as more
+ robust and capable human beeings than the fragile customers. We don't
+ mind letting them get entagled with RT, and we let them access the Web UI.
+ They can live with beeing just the Cc or Bcc at an email.
+
+
+Internal Requestor
+
+ An Internal Requestor is usually internal to the company. He might be 1st
+ line support sending matters to tech support or similar. Might be an
+ internal employee sending matters to tech support (or even 1st line
+ support if he's not sure where to send matters). It might also be that
+ "ordinary" requestors actually might be treated as intelligent human
+ beeings rather than VIPs, i.e. in open source projects ... we'll still
+ call them "Internal Requestors" as they don't need the special VIP
+ treatment.
diff --git a/rt/docs/design_docs/cli_spec b/rt/docs/design_docs/cli_spec
new file mode 100644
index 000000000..48a7f34e1
--- /dev/null
+++ b/rt/docs/design_docs/cli_spec
@@ -0,0 +1,354 @@
+
+Find tickets to operate on:
+ --id=<tickets> Find only tickets in the range <tickets>
+ synonyms:
+ --limit-id, --tickets, --limit-tickets
+ --limit-queue=<queue>
+ --limit-status=<status>
+ --limit-owner=<owner>
+ --limit-priority=<priority>
+ --limit-requestor=<email>
+ --limit-subject=<string> (Subject contains)
+ --limit-body=<string> (body contains)
+ --limit-created=(before/after) <date>
+ --limit-due=(before/after) <date>
+ --limit-starts=(before/after) <date>
+ --limit-started=(before/after) <date>
+
+ --limit-first=<int> Start on the <int>th row returned by the
+ database
+ --limit-rows=<int> Find only <int> rows
+
+Display:
+ --show shows a ticket history
+ --history ditto
+
+ --summary default option. shows a ticket summary
+ --format Optional format string. If not specified,
+ uses the value of ENV{'RT_LISTING_FORMAT'}
+ or an internal default
+
+
+Basic ticket editing:
+
+ --status=(open|stall|resolve|kill)
+ --subject=<string>
+ --owner=<owner>
+ --queue=<queue>
+ --time-left=<minutes>
+
+Watcher-related editing:
+
+ --add-requestor=<email>
+ --del-requestor=<email>
+ --add-cc=<email>
+ --del-cc=<email>
+ --add-admincc=<email>
+ --del-admincc=<email>
+
+Priority related editing:
+
+ --priority=<int>
+ --final-priority=<int>
+
+Date related editing:
+
+ --due=date
+ --starts=date
+ --started=date
+ --contacted=date
+
+
+
+Ticket updates:
+
+ --comment
+ --reply | --respond
+
+
+Links
+
+ --add-link
+ --type=<DependsOn|MemberOf|RelatedTo>
+ needs one of:
+ --target=<ticketid>
+ --base=<ticketid>
+
+ --del-link <link-id>
+
+
+
+Condiments:
+ any update can take:
+
+ --time-taken <minutes>
+
+ Ticket updates can take:
+
+ --source -- specify a source file to read the content from
+ --edit = give me an editor to edit the message
+ --no-edit = don't give me an editor to edit the message.
+
+
+
+
+----- Forwarded message from deborah kaplan <deborah@curl.com> -----
+
+Date: Fri, 14 Apr 2000 11:43:18 -0400 (EDT)
+From: deborah kaplan <deborah@curl.com>
+To: Jesse <jesse@fsck.com>
+Subject: Re: [rt-devel] RT Projects list
+
+Finally, here is the functional spec for the command line
+interface. This is for the user interface only; if you think
+this is right, I will add the administrative interface as well.
+Should I post to rt-devel, add to the ticket, or just modify
+based on your kibbitzing? When you are happy with it I'll start
+the code.
+
+-deborah
+
+
+RT command line interface functional specification
+Author: Deborah Kaplan (Deborah@suberic.net)
+Version:0.1
+
+Requirements:
+
+RT needs a CLI for various reasons. If a user is restricted to a
+dumb terminal, she needs to be able to access the RT database and
+manipulate it fully. The full functionality of both the RT
+database and the RT administrative interface should be available
+from this CLI.
+
+There are two possible types of CLI which I will discuss here.
+The first is a curses-style interface, which allows the user to
+move about a series of menus and choices, usually using arrow
+keys. As RT supplies a Web interface, there is no need for this
+curses-style interface to be written as part of RT. Instead, the
+RT developers should pick one tty-based Web browser (e.g. lynx,
+w3m) and make sure that all of the RT pages are easily readable
+with that tty based browser. Installation of that browser should
+be recommended in the RT installation documentation as a
+supported method of accessing RT from a tty.
+
+The second possible type of CLI is more minimal: a series of
+commands which can be run at a UNIX command prompt which provide
+full functionality to the RT database and administrative
+interface. There are two major benefits to this second type of
+CLI. First of all, in order to use this CLI, you need no extra
+tools (Web browsers, etc.). All that is required is a UNIX
+command line prompt and an installation of RT. Secondly, a user
+of RT who has a very specific command to run and who knows the
+appropriate CLI commands can accomplish her task much more
+quickly with a single command then she could navigating through a
+menu based interface.
+
+In the specification, I will describe the second type of CLI.
+
+Caveats:
+
+This specification draws heavily on the structure of formatting
+command line options for cvs. RT faces a smaller version of the
+same kinds of problems cvs faces: we want to create a very rich
+command set without sacrificing ease-of-use.
+
+I am not wedded to any specific command names if they seem
+impractical; I merely am proposing the command names that seem
+reasonable to me at this moment.
+
+Finally, I am finding the functioning of the web UI from RT 1.
+If the functionality differs greatly in RT 2, I will need to
+modify this specification.
+
+Specification:
+
+There are two commands: "rt", which is the primary interface to
+the database, and "rtadmin", which is the administrative
+interface to the database.
+
+The format of an rt command is as follows:
+
+ rt <command>
+ <command> is one of:
+
+ - help
+ print an overview of the commands which can be run
+
+ - print <queue> <options>
+ with no options, dump to the screen a list of all open
+ requests in <queue> -- the equivalent of "Display Queue" in
+ the existing Web interface.
+
+ <queue> is the name of an RT queue
+ <option> is either:
+
+ -f <filename> | --filename <filename>
+ where <filename> is the name of a file (defaulting to
+ ~/.rtrc) in which the options described below can be
+ placed in the format "^ <long option name> <option value>
+ $".
+
+ Or a series of the following options:
+
+ -o <owner name> | --owner <owner name>: restrict tickets
+ viewed to those owned by <owner name>.
+ This option can be used multiple times in one call of
+ the rt command in order to produce a list which
+ contains tickets owned by multiple owners. Giving the
+ empty string ("") as an option to this switch will
+ restrict tickets viewed to those which have no owner.
+ If this switch is given with no argument, the option
+ defaults to the user name of the currently running
+ process.
+
+ -r <requestor name> | --requestor <requestor name>:
+ restrict tickets viewed to those requested by <requestor
+ name>.
+ This option can be used multiple times in one call of
+ the rt command in order to produce a list which
+ contains tickets requested by multiple requesters. If
+ this switch is given with no arguments, it produces an
+ error.
+
+ -s <status> | --status <status>: restrict tickets viewed
+ to those with the status named in <status>.
+ This option can be used multiple times in one call of
+ the rt command in order to produce a list which
+ contains tickets with multiple statuses (statii?
+ Dragon NaturallySpeaking recognizes "statuses" as a
+ word). This option defaults to status "open".
+
+ -j <subject> | --subject <subject>: restrict tickets
+ viewed to those which contain <subject> as a substring in
+ the subject field of the ticket.
+ This command can be used multiple times in one call of
+ the rt command in order to produce a list which
+ contains tickets with various subject substrings. If
+ the option is called with no argument, the result is
+ an error.
+
+ -h | --help: print a usage message.
+
+ -n | --number: print out a specific ticket.
+ This command can be used multiple times to produce a
+ list which contains multiple tickets. If the option
+ is called with no argument, the result is an error.
+
+ This completes all of the print options which are available
+ in the Web interface, except the sort options. I maintain
+ that this command is already excessively complex, and that
+ adding functionality which can be replicated easily by
+ standard UNIX tools is unnecessary added complexity. I
+ recommend that the man pages and documentation for this
+ option contain an example of a command line run (e.g. of rt |
+ awk) which replicates the sorting functionality provided by
+ the Web interface.
+
+ - edit <ticket> <options>
+ with no options, or with no <ticket>, produces the same
+ output as the --help option.
+ Otherwise, edits the ticket with number <ticket> as
+ indicated in the options given. All options listed below
+ except for --help and --number can be used in conjunction
+ with one another to change many features of the same ticket
+ all at once.
+
+ -h | --help: print usage message
+
+ -s <status> | --status <status>: change the status to the
+ status listed in <status>.
+ No <status> listed, or 1 listed it does not come from
+ a list of approve statuses, produces an error.
+
+ -o <owner name> | --owner <owner name>: set to the owner
+ of the ticket the owner named.
+ Follows whatever convention is finally decided on for
+ the requirement to steal a ticket that is owned by
+ somebody else. No <owner named> listed has the user
+ who is running the rt program take the ticket. If
+ that user is not a valid owner, or the 1 listed does
+ not come from a list of approve names, produces an
+ error.
+
+ -r <requestor name> | --requestor <requestor name>: sets
+ the requestor to <requestor name>.
+ Follows any conventions that the Web UI follows to
+ make sure that this is a legal name. If not legal, or
+ left blank, produces an error.
+
+ -j <subject> | --subject <subject>: sets the subject of
+ the ticket to <subject>.
+ If the option is called with no argument, the result
+ is an error.
+
+ -n <number one> <number 2> | --number <number one>
+ <number 2>: merges ticket number <number one> into ticket
+ <number 2>.
+ If both arguments are not provided, the result is an
+ error.
+
+ -q <queue> | --queue <queue>: set the queue to that
+ named.
+ If <queue> is not listed, or the 1 listed does not
+ come from a list of approve queues, produces an
+ error.
+
+ -a <area> | --area <area>: set the area of the ticket to
+ that named.
+ If <area> is not listed, or the 1 listed does not come
+ from a list of approve areas, produces an error.
+
+ -c <time stamp> | --contact <time stamp>: sets the last
+ user contact field, and produces an error if the format
+ is invalid.
+ If the argument is left blank, sets the last user
+ contact field to now.
+
+ -p <priority> | --priority <priority>: sets the current
+ priority to the 1 listed.
+ Produces an error if the argument is left blank.
+
+ -f <priority> | --final <priority>: sets the final
+ priority to the 1 listed.
+ Produces an error if the arguments left blank.
+
+ -d <date due> | --datedue <date due>: sets the due date
+ to the 1 listed.
+ Produces an error if the argument is left blank, or if
+ the format is invalid.
+
+ - comment <options>
+ with no options, this command reads from standard input
+ until it sees EOF and appends that to the ticket as a
+ comment.
+
+ -h | --help: print usage message
+
+ -c | --comment: append as a comment. This is the default behavior.
+
+ -r | --reply: append as a reply.
+
+ -f <filename> | --file <filename>: can be used with
+ either the comment or reply options. Instead of reading
+ from standard input, read the text of the comment or
+ reply from the file <filename>.
+
+ - report <options>
+ this command is a place holder for reporting functionality
+ which does not yet exist. It will probably have the
+ default behavior to select reports at the command line or
+ choose default reports from a .rtrc file. In a future
+ version, it can output graphs in some graphical format.
+
+
+
+----- End forwarded message -----
+
+--
+jesse reed vincent -- root@eruditorum.org -- jesse@fsck.com
+70EBAC90: 2A07 FC22 7DB4 42C1 9D71 0108 41A3 3FB3 70EB AC90
+
+"If IBM _wanted_ to make clones, we could make them cheaper and faster than
+anyone else!" - An IBM Rep. visiting Vassar College's Comp Sci Department.
+
diff --git a/rt/docs/design_docs/cvs_integration b/rt/docs/design_docs/cvs_integration
new file mode 100644
index 000000000..35c8737ed
--- /dev/null
+++ b/rt/docs/design_docs/cvs_integration
@@ -0,0 +1,164 @@
+jesse@FSCK.COM: ok. anyone here
+ interested in having RT as a bug tracker integrated with CVS? ()
+
+marc: in principle, sure. ()
+
+jesse@FSCK.COM: want to write up your
+ ideal of how such a beast would work? ()
+
+alex_c: what sort of integration are you thinking of, Jesse? ()
+
+jesse@FSCK.COM: well, that's what I want
+ to know, alex. lots of people want their bug trackers tied to their
+ version control. I want to know what people want it to _do_ ;) ()
+
+alex_c: weird. :) ()
+
+marc: similarly to what the debian bts does.
+ you put a magic string ("rt-closes#123") and it causes the bug in rt to
+ be closed (or appended with a different magic string) with the commit
+ message. also nice would be if rt would then generate links to a
+ webcvs server. ()
+
+jhawk: Hrmm. cvs front-end that strips 'em out?
+ Perhaps with RT: lines instead of CVS: lines in the commit
+ interaction? ()
+
+marc: the magic string goes in the commit
+ message, that is. no, use one of the magic post-commit scripts. ()
+
+
+jesse@FSCK.COM: well, there's also the
+ pre-commit script to lock out commits wihtout a ticket id ()
+
+jhawk: Personally, I don't want to force special
+ magic strings to the bug-tracking system, some of which may be
+ confidential, to appear in the cvs logs. ()
+
+marc: I could see wanting that on a release
+ branch. ()
+
+jhawk: I also think it would be cool to supply
+ template stuff for you to edit. ()
+
+jesse@FSCK.COM: I'm not sure cvs can be
+ made to do that. can it? (generate templates) ()
+
+jhawk: It would be reasonable, in my model, to
+ turn some kinds of RT: lines into things that fell in the commit
+ message, but not all kinds. ()
+
+marc: I don't quite see jhawk's objection. ()
+
+ghudson: In my observation, locking out commits
+ without a ticket ID is usually an impediment to development, and leads
+ to developers having the one bug which all commits cite. ()
+
+jhawk: If you had a CVS frontend, it could geneate
+ the template and feed it to 'cvs commit -m' ()
+
+ghudson: CVS can generate templates and verify
+ that they have been filled in. ()
+
+jhawk: What Greg says sounds cool; greg, what do
+ you mean? marc: one sec. ()
+
+marc: I think assuming a frontend is a terrible
+ idea. ()
+
+jesse@FSCK.COM: greg: agreed. but people
+ seem to want it. the idea would be only for a locked down release
+ branch. ()
+
+jhawk: marc: So, I might want to close an open
+ ticket as part of a commit message without that showing up in the
+ coommit message. Or to insert a splufty long comment into a ticket
+ while I do the commit but not close or really change the state, and
+ that comment might want to ramble a lot but not include that ramble in
+ the commit message. ()
+
+jesse@FSCK.COM: well, then arguably, you
+ might want to not use the commit message for that update, but instead
+ just go straight to the bts ()
+
+marc: I think the idea is to force you to
+ mention the ticket closing in the commit message. ()
+
+jesse@FSCK.COM: but yeah, state changing
+ and 'update messages' are seperate concepts that should both be
+ supported. ()
+
+jesse@FSCK.COM: part of the idea is to
+ drag the commit message into the BTS ()
+
+jhawk: Err, I think it quite frequent that I want
+ to put seperate info in both the commit message and the ticket system,
+ and entering them at the same time seems cool. ()
+
+jesse@FSCK.COM: ok. noted. I'll see if
+ that's doable, when i get around to this. ()
+
+marc: so I think you want a custom front-end,
+ but I don't think what you want is what jesse is talking about. ()
+
+jesse@FSCK.COM: the thing that would be
+ really cool that scare the pants off me is tracking which branches bugs
+ exist in / are fixed in ()
+
+jesse@FSCK.COM: what jhawk wants should
+ be doable, now that I understand his reqts. ()
+
+marc: that would require the bts to understand
+ branches in some fundamental way. ()
+
+jesse@FSCK.COM: yes. see above, about
+ the pants. ()
+
+sly: uh oh, not more people losing their pants... ..
+
+
+ghudson: RT needs to know the names of branches
+ and their structure (so that you can tell it "fixed in foo" and it
+ knows that the bug is still fixed in anything that branches off of foo,
+ but not necessarily in other new branches), but nothing more than that.
+
+jhawk: So, note that what I'm describing is how
+ I'd like the UI to be, from a generic architectural level, and not
+ really thinking terribly specific. Greg, can you explain the CVS
+ template thing? ()
+
+jesse@FSCK.COM: and it needs to know
+ exactly "when" a branch happens. because "fixed in foo" won't fix
+ something that branched off foo yesterday ()
+
+marc: jesse was talking about integrating rt
+ with cvs. building a new developent+repository+bts from scratch would
+ be a problem with larger scope :-) ()
+
+jesse@FSCK.COM: marc: was that in
+ response to jhawk? ()
+
+ghudson: CVS and templates: "rcsinfo" lets you
+ specify a template for log messages, and "commitinfo" lets you check
+ them. ()
+
+ghudson: Er, sorry, my bad.
+ s/commitinfo/verifymsg/ ()
+
+marc: with cvs, if you have the revision number
+ of the fix (which you should). you can use the branch version number to
+ get a date and see when the branch happened relative to the fix. ()
+
+marc: jesse: yes. ()
+
+jesse@FSCK.COM: Ok. would people
+ consider "integration with CVS" to be subpar or incomplete if it didn't
+ deal with tracking branches? ()
+
+marc: incomplete relative to an ideal, but not
+ subpar, as it would still be useful. ()
+
+allbery@CS.CMU.EDU: CVS's branch
+ support sucks so much that failure to work with it is hardly a bug ()
+
+
diff --git a/rt/docs/design_docs/evil_plans b/rt/docs/design_docs/evil_plans
new file mode 100644
index 000000000..34b9f81a2
--- /dev/null
+++ b/rt/docs/design_docs/evil_plans
@@ -0,0 +1,167 @@
+Current planned 2.2 feature list. subject to change.
+
+
+Core
+
+Should Make "Owner" a watcher type, rather than a special ticket attribute,
+ under the hood. This wins for ACL and code consistency reasons.
+
+Web UI
+
+Should New "Tools" top level menu
+Should "This week in RT" at a glance.
+Nice "RT Stats" overview.
+Nice recent and favorite items
+
+
+per-user configuration
+
+Must Saveable user preferences.
+
+ The ideal implementation would be "saveable user metadata",
+ including things like "Alternate Email Addresses". To
+ do this right, not all user metadata would be directly
+ editable by the user who has "ModifySelf" it may be that
+ this is a "system" datastore that gets accessed by various
+ functions, some of which the user has access to modify and
+ some of which only the system does.
+
+ API: Set field "FOO" to value "BAR" for user BAZ
+ What values does field "FOO" have for user BAZ?
+ Clear all values of "FOO" for user BAZ
+ What users have value "BAR" for field "FOO"
+
+ Example usages:
+
+ What users have the alternative email address matching
+ "boo@fsck.com"
+ What custom searches does user BAZ have defined?
+ What is baz's default queue?
+
+ Actually, I feel a little sketchy about Alternative Email
+ Addresses in there. I'm not quite sure why yet.
+
+ The same would really be useful for queues. Damn it. I think
+ I want a registry.
+
+
+
+Searching
+
+Must Ability to define search result format.
+should Saveable user searches.
+nice Sharable searches.
+
+
+Scrips
+
+must Include more Conditions; at least those contributed so far
+ that make sense in my grand scheme of things
+
+should The name should change to something that people don't think is
+ spelled wrong. ("I will not invent words\n" x 1000)
+
+nice Scrips could apply to a list of queues, rather than just one queue or
+ all of them.
+
+
+Custom fields
+
+Must "KeywordSelects" become "Custom Fields"
+Should String and multi-string custom fields.
+Nice Date custom fields
+Nice Some way to order and group custom fields.
+Nice Default values
+Nice Required values
+Nice Make custom fields apply to an enumerated list of queues,
+ rather than just one.
+
+
+Web infrastructure
+
+Must Full fastcgi support.
+
+
+Installation
+
+Should Better FSSTD conformance:
+ bins in /bin
+ admin tools in /sbin (does this include rtadmin?)
+ ephemeral data in /var
+ rename config file
+ force local RT search path?
+
+Mail gateway
+
+must Integrate gpg-authenticated command-by-mail mode
+
+
+
+Core
+
+should Use apache logging, if available
+should Use syslog, if available.
+should Mail user new password, as an Action, so it can be invoked either
+ as a scripaction or from the web ui.
+
+
+
+Web Services Framework
+
+Should Expose an API to create a ticket by HTTP posting an XML document.
+Should Provide an RSS feed to display tickets matching certain criteria
+Nice Allow ticket updates via the web ui
+Nice Export full ticket metadata and history as XML
+
+Note: I currently favor the REST philosophy that GET and POST to specific,
+ defined URLs provides everything one needs to build comprehensive
+ web services without the massive added complexity of a SOAP or XML-RPC
+ framework.
+
+
+ACLs:
+
+Wish New ACL primitives for:
+
+ List all users who have right "FOO" on object "BAR"
+ List all rights user "BAZ" has for object "BAR"
+ List all objects for which user "BAR" has right "FOO"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+For the near future:
+
+ Use case:
+ Jesse wants to get notified of all tickets in queue 'RT Bugs'
+ with a severity of 'critical' and also have a requestor whcih matches 'fsck.com'.
+ I'm not sure this is the best idea.
+
+
+ Site admins define a number of subscriptions and can sign up individual
+ users, groups or metagroups to get mail on that subscription.
+
+ Basically, an admin would define "On Condition, notify as comment with
+ template _template_"
+
+ There would be a new table called "subscriptions"(?) that would have
+ the structure:
+
+ id
+ ScripId
+ PrincipalType ENUM: User, Group, Owner, Requestors, AdminCcs, Ccs
+ PrincipalId -- UserId or GroupId. For Owner, Requestors, AdminCcs, Ccs, it doesn't really make a lick of difference.
diff --git a/rt/docs/design_docs/link-definitions.txt b/rt/docs/design_docs/link-definitions.txt
new file mode 100644
index 000000000..30b903567
--- /dev/null
+++ b/rt/docs/design_docs/link-definitions.txt
@@ -0,0 +1,143 @@
+For 2.0, those Linking actions should be supported:
+
+1. DependentOn; TobiX-style.
+
+ BASE is dependent on TARGET.
+
+ ...meaning that TARGET has to be resolved before BASE (really) is
+ resolved.
+
+ According to TobiX, those "weird action" makes sense:
+ ...when the link and/or TARGET is created, the BASE might be stalled.
+ Alternatively, this should be very trivial to request through the UIs.
+ ...when the TARGET is resolved, BASE will be reopened if it's stalled.
+
+ An alternative to those "weird actions" is to have some run-time logic that
+ takes care of this; i.e. letting the search interface handle "please hide
+ all requests with unresolved dependencies"
+
+ TobiX will need to make dependency links into Bugzilla.
+
+ Dependency links should be made when more work to BASE should be done
+ after the TARGET is resolved and/or BASE can't be resolved before TARGET is
+ resolved.
+
+ Dependency links are often 1:1, but n:n links makes sense; one ticket can
+ depend on several others, several tickets can depend on one ticket, etc.
+
+ Loops don't make sense at all, but the system above won't break if it
+ encounter loops.
+
+ Dependency links is more for workflow than anything else. When a new
+ TARGET is created, some of the work might be passed over to another
+ department/person ... but _not_ the responsibility for the communication
+ with the external requestor.
+
+2. MemberOf link (grouping)
+
+ BASE is a member of TARGET.
+
+ TobiX-style "weird actions":
+ ...when TARGET is beeing replied to, all BASE requestors should get the
+ reply.
+
+ ...when TARGET is resolved, all BASE tickets should be resolved (unless
+ they have other unresolved Dependencies/MemberOf links).
+
+ ...when all BASEs to one TARGET are resolved, TARGET should be resolved.
+
+ The alternative is to let the user choose "reply to all" and "resolve all"
+ through the user interfaces.
+
+ MemberOf should be used when BASE ticket states more or less the same as
+ the TARGET ticket, and we do want to give a reply to all requestors, but we
+ don't want to merge them (Individual tickets from individual external
+ requestors should be respected as separate entities). If BASE tickets from
+ more than one external requestor is linked to a TARGET ticket, we denote
+ the TARGET ticket as a "Group ticket". This is only a documentation
+ definition, you won't find any references to "Group tickets" in the source.
+
+ I think the proper etiquette should be to clearly state in a reply to a
+ group ticket that the mail is going to several persons, and that the
+ requestor should reply back if they feel their Ticket hasn't got the
+ attention it deserves. The user documentation should reflect this.
+
+ MemberOf links can also be used to hand away the work flow. The person in
+ charge of the TARGET ticket will also be in charge of the BASE tickets and
+ the communication with the end user.
+
+ If a work task needs to be splitted into two subtasks, MemberOf might also be
+ used.
+
+ 1:n links makes more sense, but n:n can also work in some cases.
+ The reply stuff might break seriously upon loops. Recursement might be
+ handy for splitting a work task into subtasks (making a hierarchical tree
+ of the worktasks).
+
+
+3. Merge (connecting)
+
+ BASE is the same as TARGET.
+
+ ...the system should somehow merge together transactions for both tickets.
+ ...BASE should be more or less deleted, only the TARGET should apply.
+ ...actions done toward BASE should be redirected to TARGET.
+
+ I think MergeLinks should be used when two tickets accidentally has
+ appeared twice in the system, and/or there is no reason to keep the two
+ tickets separately. It might be that it's the same requestor (i.e.
+ clicking the "send" button twice in a web environment) or that we don't
+ care much about giving the requestor individual follow-up (typically
+ "internal" requestors, etc.)
+
+ Based on user feedback, merged tickets will be displayed as the same ticket
+within RT's user interfaces. but the original tickets' transactions will be
+kept seperated in the database. this may require some magic.
+
+4. RefersTo / No Action link (linking)
+
+ BASE is somewhat related to TARGET
+
+ No special actions will be taken.
+
+ Loops might maybe make sense
+
+BASE and TARGET are usually Tickets within one RT instance, but it
+might also point to external RT instances, other DB systems, etc.
+
+
+
+
+In future revisions, it should be very easy to set up site-specific link action types.
+We should also consider to include more linking actions in the box.
+
+An example stolen from John Rouillard. Eventually the [comments] should be
+removed, and the text modified to fit the planned 2.0 link actions:
+
+ ticket problem
+ 1 can't connect to hosts with netscape
+ 2 ping is broken
+ 3 Can't send email: error no space on spool/mqueue
+
+ You have the above in the queue. You realize that DNS is down. Spawn
+ a ticket
+
+ 4 DNS is down
+
+ mergelink 1 and 2 to it [I would rather say "make a MemberOf link _or_ a
+ dependency link from 1 and 2 to 4" --TobiX] (if you choose to stall 1 and
+ 2 automatically feel free, its just a shell script change) [well, you
+ might choose dependency instead of MemberOf --TobiX]. The person working
+ on 3 has come to the conclusion that outgoing mail is backing up because
+ of the DNS failure. She has cleared space by copying the mail queue to
+ another disk, but can't really get email working till DNS is up. So she
+ creates a Dependency linkon ticket 4 stalling ticket 3.
+
+ We finally get DNS working and resolve ticket 3. What happens? Tickets 1
+ and 2 are resolved and email is sent to requestors notifying them of the
+ resolution [This is the default behaviour for 2.0 MemberOf-linked tickets.
+ Remember that if we send Replies to "Group Tickets" (that is, the target
+ of several "MemberOf" links) --TobiX]. Ticket 4 [should be 3? --TobiX] is
+ reopened and the person working on it starts flushing the mail queue and
+ the moved mailq by hand.
+
diff --git a/rt/docs/design_docs/local_hacking b/rt/docs/design_docs/local_hacking
new file mode 100644
index 000000000..c06d1126d
--- /dev/null
+++ b/rt/docs/design_docs/local_hacking
@@ -0,0 +1,32 @@
+To facilitate local hacking, RT needs a mechanism to allow site administrators
+to easily add HTML templates for the web ui and to replace sections
+of code in RT's core modules _without_ having to modify those modules
+
+We'll use several methods to achieve this goal.
+
+ Webui
+ HTML::Mason allows users to create multiple
+component hierarchies. RT should ship with a local component root
+defined and available. This root should be configured as the "primary"
+component root.
+
+
+ Core modules
+
+ This gets a bit trickier. we want to allow people to trivially
+subclass core modules and to use those subclasses throughout the code.
+
+The way we're going to handle this is by setting up a number of subroutines
+in config.pm that look something like this:
+
+sub NewTicketObj {
+ eval "require $TicketClass";
+ my $object = new $TicketClass;
+ return ($object);
+}
+
+# This variable is used for ref type checking
+$TicketClass = "RT::Ticket";
+
+we could use an eval around the require and thus completely avoid specifying
+the object in two places. which feels like a win. but i'm worried about perf.
diff --git a/rt/docs/design_docs/subscription-definitions.txt b/rt/docs/design_docs/subscription-definitions.txt
new file mode 100755
index 000000000..deda35cda
--- /dev/null
+++ b/rt/docs/design_docs/subscription-definitions.txt
@@ -0,0 +1,113 @@
+NEW SCRIP NOTES
+
+
+RT Actions:
+
+
+ EmailOwnerAsComment
+ Send mail to the ticket owner from the queue's comment address
+
+ EmailOwnerOrAdminWatchersAsComment
+ Send mail to the ticket owner, or if there is no owner, the ticket's admin watchers
+ from the queue's comment addresses
+
+ EmailAdminWatchersAsComment
+ Send mail to the ticket's adminstrative watchers from the queue's comment address
+
+
+
+ EmailOwner
+ Send mail to the ticket owner from the queue's correspond address
+
+ EmailOwnerOrAdminWatchers
+ Send mail to the ticket owner, or if there is no owner, the ticket's admin watchers
+ from the queue's correspond addresses
+
+ EmailAdminWatchers
+ Send mail to the ticket's adminstrative watchers from the queue's correspond address
+
+ EmailWatchers
+ Send mail to the ticket watchers from the queue's correspond address
+
+ AutoReply
+ Sendmail to the requestor from the queue's correspond address.
+
+
+
+RT Conditions:
+ OnCreate
+ OnEachTransaction
+ OnComment
+ OnCorrespond
+
+
+
+
+
+What is an Action?
+
+...some piece of code that can do something whenever a transaction is done.
+The actions shipped with RT sends email and can handle some logic that makes
+sense for some instances. site-specific modules can be dropped in to
+perform special actions.
+
+
+What can an Action do?
+
+- decide whether it's applicable or not
+- prepare
+- commit
+- describe itself
+
+...and if it's a subclass of SendEmail, you can also override a lot.
+
+Currently the schema.mysql contains a list of the basic subscription-related
+actions that will be bundled with RT.
+
+
+What is a Scrip?
+
+...it's an entry in the database that tells that an action is to be
+performed with a certain template and argument. Template and argument
+doesn't make sense in all contexts. A scrip can be limited to transaction
+types; the current implementation allows a comma-separated list (though for
+a "cleaner" schema design, it should be a separate table for this?). It has
+a name and a description.
+
+
+What is a ScripScope?
+
+...an indication of what queues the different Scrips applies to. It should
+be easy to remove/insert ScripScope objects by the admin tools.
+
+
+What is a Watcher?
+
+...it's a request for beeing kept updated on a ticket and/or a queue
+and/or whatever. It is to be used by the Actions. Watcher items can
+easily be enabled/disabled through the `Quiet' attribute. `Type' might
+indicate what emails the watcher wants to get and how to get them.
+
+The Bcc/Cc watchers should be handled by the NotifyWatchers action which is
+run regardless of the Scrips.
+
+
+What is a Template?
+
+...A template is a text template that is to be used for outgoing email -
+or for different use for different actions. One template can be used by
+several Scrips.
+
+
+How does the system determinate whom to send mail to?
+
+The ScripScope table in the DB should indicate whether a Scrip is relevant
+for a queue or not /* TobiX thinks that this might eventually be extended to
+keywords, tickets, etc, and not only Queues */ ... the Scope table should
+indicate whether the Scrip is relevant for a given transaction type ... then
+the given Action should determinate whether it applies or not, and finally
+the Action has to find out (via the Watchers table) whom it applies to, and
+how to contact them ... and the Template tells how the mails that are sent
+out should look like.
+
+
diff --git a/rt/docs/design_docs/users b/rt/docs/design_docs/users
new file mode 100644
index 000000000..71c4476c9
--- /dev/null
+++ b/rt/docs/design_docs/users
@@ -0,0 +1,14 @@
+RT2 makes everybody a user. some sites won't like this. there
+should be away to make an "anonymous" user who the mailgate makes
+the requestor for all mailed in tickets. it would then set the
+ticket 'requestor' watcher's alternate email address to the real
+requestor's email.
+
+additionally, eventually, users will need to be deleted. RT doesn't
+want any user deleted. Instead, there will be a flag in the user's
+entry in the users table called 'Disabled.' Disabled users will
+not be able to be granted rights.
+
+ The process of disabling a user should remove their acls and
+should force the giving away of their tickets or reject the disabling.
+
diff --git a/rt/docs/rt.gif b/rt/docs/rt.gif
new file mode 100755
index 000000000..693b06238
--- /dev/null
+++ b/rt/docs/rt.gif
Binary files differ