outanekka.KIESS.ONL -- multiuser image display web solution with additional features!
theme » relaxed · tek · unique ·
user:   password:

About outanekka — your multiuser image display web solution with additional features

support and donate

You can support the outanekka multiuser image display web solution with additional features development as well as take a share of the server hosting costs by donating a small amount of money.

about outanekka

The outanekka base arrived at version 0.9.0.16 and is developed by Adrian Immanuel Kieß.

You can contact Adrian Immanuel Kieß under:

  1. E-Mail: adrian@kiess.onl
  2. XMPP: adrian@kiess.onl
  3. Website: https://www.KIESS.ONL

Outanekka is the so called summary of all those below listed modules and additional files:

  1. text is v0.9.0.16, last edit: 20.07.14.

    ,1

  2. config is v0.9.0.16, last edit: 20.07.15.

    5';
    our $VER = sprintf("%vd", $VERSION);
    
    our $MODULE = __PACKAGE__;
    our $PATH = q/conf\//;
    our $MODULE_PATH = q/conf\/modules\//;
    our $SUFFIX = q/.conf/;
    
    
    =head2 FUNCTIONS
     
    =over 4
    
    =item readConfigFile()
     
    readConfigFile() reads in a modules configuration file or defaults to the 
    base outanekka.conf configuration file.
    
    =cut
    			  
    sub readConfigFile {
      my $module = shift;
      my ($config, $pkg);
    
      if ($module) {
        $config = $MODULE_PATH . $module . $SUFFIX;
      } else {
        $config = $PATH . 'outanekka' . $SUFFIX;
      }
    
      unless (-e $config) {  
         die "Fatal: Configuration file $config not found! $!\n";
      }
      
      $pkg = q{ 
           package conf;
           do $config or die "Fatal: Configuration file $config misconfigured! $!\n";
           1

  3. home is v0.9.0.12, last edit: 19.05.02.

    ;
    
    # vim: noai:sts=2 sw=2 ts=2
    #
    # EOF
    

  4. chatbox is v0.9.0.12, last edit: 19.04.28.

    ;
    
    # vim: noai:sts=2 sw=2 ts=2
    #
    # EOF
    
    

  5. imagery is v0.9.0.16, last edit: 20.07.19.

    ;
    
    # vim: noai:sts=2 sw=2 ts=2
    #
    # EOF
    

  6. theme is v0.9.0.13, last edit: 20.04.13.

     AUTHOR
    
    Adrian Immanuel Kiess - < http://www.kiess.onl/ >
    
    =cut
    
    1

  7. user is v0.9.0.16, last edit: 20.07.14.

    6384;
    
    our $accountId = (); # set to user id
    our $accountNick = (); # set to user nick
    our $accountLevel = (); # set to rightslevel
    our $sessionKey = ();
    
    =head2 FUNCTIONS
    
    =over 4 
    
    =item run()
    
    run() is called from html.pm.
    
    =cut
    
    sub run {
    	if ($Q_MODULE and $Q_MODULE eq $MODULE) {
    		my $o;
    		my $v = $q->p(&about::module::moduleVersion($MODULE, $VER) .
    			   &about::module::moduleVersion($MODULE . "::account", $user::account::VER) .
    			   &about::module::moduleVersion($MODULE . "::page", $user::page::VER) .
    			   &about::module::moduleVersion($MODULE . "::profile", $user::profile::VER) .
    			   &about::module::moduleVersion($MODULE . "::session", $user::session::VER));
    												  
        if ($Q_ACTION) {    
          for ($Q_ACTION) {		     
            /^account$/ && do { $o .= &user::page::account(); last; };
            /^accountedit$/ && do { $o .= &user::page::accountedit(); last; };
            /^delete$/ && do { $o .= &user::page::delete(); last; };
    			  /^list$/ && do { $o .= &user::page::list(); last; };
    			  /^listedit$/ && do { $o .= &user::page::listedit(); last; };
    			  /^login$/ && do { $o .= &user::page::login(); last; };
            /^logout$/ && do { $o .= &user::page::logout(); last; };
    				/^passwordrequest$/ && do { $o .= &user::page::passwordrequest(); last; };
    			  /^profile$/ && do { $o .= &user::page::profile(); last; };
    			  /^profileedit$/ && do { $o .= &user::page::profileedit(); last; };
    				/^signup$/ && do { $o .= &user::page::signup(); last; };
    				
    				$o .= &user::page::list();
          } 
        }
        else {
          $o .= &user::page::list();
        }
    
    		return ($o ? $o : "") . $v;
      }
    }
    
    
    =head1

  8. about is v0.9.0.12, last edit: 19.04.16.

    ;
    
    our $q = new CGI; 
    our $VERSION = 0.9.0.1

  9. html is v0.9.0.16, last edit: 20.07.15.

    px;";
    #} else {
      #$style_section .= ;
    #}
    
    =item middle()
    
    middle() returns the main content of a page.
    
    =cut
    
    sub middle {
      
      return (&about::run() || "") . 
        (&chatbox::run() || "") . 
        (&guestbook::run() || "") .  
        (&home::run() || "") . 
    		(&imagery::run() || "") . 
    		(&user::run() || "") . 
        $q->end_div();
    
    }
    
    =item middleBegin()
    
    midleBegin().
    
    =cut
    
    sub middleBegin {
      return "\n<!-- middle() -->\n" . 
        $q->start_div({-style=>'margin-right:201

  10. basic is v0.9.0.12, last edit: 19.05.09.

    ;
    	#
    	#    if (!-l $file && -d $file) {
    	#      rmdir $file; # or warn $!;
    	#    } else {
    	#      unlink $file; # or warn $!;
    	#    }
    	#  },
    	#  untaint => 1

  11. guestbook is v0.9.0.16, last edit: 20.07.14.

     DESCRIPTION
    
    The guestbook module allows unauthorized users to leave their opinion. 
    A superuser can edit and delete entries. 
    In conclution it is - well, a simple guestbook.
    
    =head2 STATUS
    
    The status is considered stable.
    
    =cut
    
    
    BEGIN {     
      my @sql = (
        qq{CREATE TABLE IF NOT EXISTS guestbook (   
            id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
            opinion	TEXT,
            email	TINYTEXT,
            unixtime BIGINT UNSIGNED default NULL,
            PRIMARY KEY (id)
          );
        },
    		#qq{ALTER TABLE guestbook MODIFY COLUMN id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT;},
      );
    
      for (@sql) {
        my $sth = $main::dbh->prepare($_) or die $main::dbh->errstr;
        $sth->execute or die $main::dbh->errstr;
        $sth->finish;
      }
    }
    
    $| = 1

  12. about::page is v0.9.0.16, last edit: 20.07.19.

     NAME
    
    about::page.pm
    
    =head1

  13. about::module is v0.9.0.16, last edit: 20.07.15.

    5';
    our $VER = sprintf("%vd", $VERSION);
    our $MODULE = \$about::MODULE;
    our $REF = \$about::REF;
    our $PATH_MODULES = \$about::PATH_MODULES;
    
    our $Q_MODULE = \$about::Q_MODULE;
    our $Q_ACTION = \$about::Q_ACTION;
    
    
    =item moduleInfo()
    
    moduleInfo() gets random lines of source code from a perl package.
    
    =cut
    
    sub moduleInfo {
      my $module = shift;
      my $randLine;
      
    	confess unless $module and -f $module and ($module =~ /\.pm$/);
      
      local $/ = 1

  14. guestbook::page is v0.9.0.16, last edit: 20.07.14.

    ,
    												-rows=>'20',
    												-cols=>'70',
    												-default=>$href->{opinion},
    												-name=>'opinion',
    											  -maxlength=>$OPINION_MAX})
    				).
    				$q->p({style=>'text-align:right'},
    					$q->submit('submit changes >>')
    				).
    				$q->end_form();  	                 
    			}
        }	
      } 
      return undef;
    }
    
    =item remove()
    
    remove() removes a opinion from the guestbook.
    
    =cut
    
    sub remove {  
      my $id = shift || $$Q_ID;
    
      if ($id and ($id =~ m/^(\d+)$/) and (&user::session::getAccountLevel >= 255) and 
    		&guestbook::opinion::remove($id)) {
        return 1

  15. guestbook::opinion is v0.9.0.16, last edit: 20.07.14.

    ;
      } 
      
      &basic::failureMessage("Removing opinion failed",
        "Could not remove opinion #" . ($id || "undefined") . "\!");
        
      return undef;
    }
    
    =item browse()
    
    browse() returns a list of opinions limitted by SKIP.
    
    =cut
    
    sub browse {  
      my $skip = shift || $$SKIP;
      my $navbar;
      my $sth;
      my $entries = $::dbh->do("select last_insert_id( ) from $$MODULE;");
      my $opinions;
        
      ($navbar, $skip) = &basic::navigation(
                          $entries,     # Total entries
                          $$REF,         # URL basepath
    				              "opinions",   # Name
    				              $$SKIP);    # Entries per page 
      
      if (defined $skip and $skip =~ /(^\d+)$/ and $navbar and $entries) {
        
        $sth = $::dbh->prepare(qq{
    	    SELECT * FROM $$MODULE ORDER BY id DESC LIMIT $skip,$$SKIP
        }) or die $::dbh->erstr;
        $sth->execute() or die $::dbh->errstr;
    
        while ( my $ref = $sth->fetchrow_hashref ) {
          $opinions .= &link($ref->{id}, 
             $ref->{opinion}, 
             $ref->{email}, 
    		     $ref->{unixtime}
    		  );
        }  
          
        if ($opinions) {
          return $navbar . $opinions . $navbar;
        }
        else {
          return undef;
        }
      }
      else {
        return undef;
      }
    }
    
    =item link()
    
    link() returns the link to an opinion as HTML formatted output.
    
    =cut
    
    sub link {  
      my $id = shift;
      my $opinion = shift;
      my $email = shift;
      my $unixtime = shift;
      	
      if ($id and $id =~ m/^\d+$/) {    		
         my $date = strftime "%B %d, %Y",gmtime($unixtime);
         $email = &text::leetEmail($email);
         $opinion = &text::formattedText($opinion);
         
         return $q->div({-class=>"textbox",
             -id=>$id,
    	       -title=>"Opinion \#$id by $email"},
             $q->div({-class=>"textbox-subformation"},
               "( " . $email ." @ " . $date . " ) " , 
             
               ( &user::session::getAccountLevel() >= 255 ) ? 
               $q->span(" [ " . 
                 $q->a({-href=>$$REF."edit/$id"},"&iquest; edit") . " ] [ " . 
                 $q->a({-href=>$$REF."delete/$id"},"&Chi; delete") . " ]"
    			      ) : "" # no rights
             ) . 
             $q->div({-class=>"textbox-content"},$opinion)
           );
      }
    }	
    
    =item queryRecord()
    
    queryRecord() returns the database record of the given opinion ID.
    
    =cut
    
    sub queryRecord {
      my $id = shift || $$Q_ID;
    	my ($sth, $href);
      
    	if ($id and ($id =~ m/^(\d+)$/)) {
        $sth = $::dbh->prepare(qq{
          SELECT opinion, email FROM $$MODULE WHERE id=(?)
        }) or die $::dbh->errstr;
        $sth->execute($id) or die $::dbh->errstr;
        $href = $sth->fetchrow_hashref;
    
    		if ($href) {
    			return $href;
    		}
    	}
      return undef;
    }
    
    =item matches()
    
    matches() searches for a similiar already existing opinion in the database.
    
    =cut
    
    sub matches {
    	my $email = shift || $q->param('email');
    	my $opinion = shift || $q->param('opinion');
    
    	if ($email and $opinion) {
    		my ($sth, $href);
    
    		$sth = $::dbh->prepare(qq{
    		  SELECT id FROM $$MODULE WHERE email LIKE (?) AND opinion LIKE (?)
    		}) or die $::dbh->errstr;
    		$sth->execute('%'.$email.'%', '%'.$opinion.'%') or die $::dbh->errstr;
    		$href = $sth->fetchrow_hashref;
    
    		if ($href and $href->{'id'} and ($href->{'id'} =~ m/^(\d+)$/)) {
    			return 1

  16. user::profile is v0.9.0.16, last edit: 20.07.20.

    ###############################################################################
    # Author: Adrian Immanuel Kiess < adrian at kiess.onl >
    # License: BSD, see LICENSE file
    # What: Module for outanekka.kiess.onl
    ###############################################################################
    
    package user::profile;
    
    use strict;
    use warnings;
    
    use CGI qw/:standard escapeHTML -utf8/;
    use CGI::Carp qw(warningsToBrowser fatalsToBrowser carpout set_message set_die_handler confess);
    use Encode qw(decode encode);
    use POSIX qw/strftime/;
    
    #use contributed::Random;
    use user;
    
    =head1

  17. user::page is v0.9.0.16, last edit: 20.07.21.

    00%'},
    				$q->Tr($q->th(["Profile","Created", "E-Mail", "Impressions", "Nick", 
    							"Rightslevel", "edit Account", "edit Profile"])),
    					$q->Tr(\@users)
    				)
    			);
      } else {
      
        return &user::page::list();
        
      }
    }
    
    =item passwordrequest()
    
    passwordrequest()
    
    =cut
    
    sub passwordrequest {
    		
    	if (&::user::account::passwordRequest()) {
    
    		return &user::page::login();
    	}
    	else {
    	  my $randomNick = &user::account::randomNick();
    							    							    
    		$q->param('module', $$MODULE);
    		$q->param('action', 'passwordrequest');
        $q->param('verify_input', '');
    
        my $verify_range = 99999;
    	  my $verify_minimum = 1

  18. user::account is v0.9.0.16, last edit: 20.07.21.

     SYNOPSIS
    
    A outanekka user module.
    
    =head1

  19. user::session is v0.9.0.16, last edit: 20.07.21.

    ;
      } else {
    
    		return undef;
    	}
    }
    
    =item lastSignups()
    
    lastSignups() returns the last signups to outanekka.
    
    =cut
    
    sub lastSignups {
      my $limit = shift || 3;
      
    	if ($limit) {
        my ($sth, $aref);
    
    		$sth = $::dbh->prepare(qq{
    			  SELECT id FROM $$MODULE ORDER BY id DESC LIMIT 0,?
    			}) or die $::dbh->erstr;
        $sth->execute($limit) or die $::dbh->errstr;
    
    		$aref = $sth->fetchall_arrayref( {} );
    
    		return $aref;
      }
    
    	return undef;
    }
    
    =item lastSignupsLinks()
    
    lastSignupsLinks() returns the links to the last signed up users.
    
    =cut
    
    sub lastSignupsLinks {
      my $limit = shift || 3;
      my ($lastSignups, @links);
    	
    	$lastSignups = &lastSignups($limit);
    
      foreach my $user (@{ $lastSignups }) {
        push @links, &user::account::link($user->{'id'}) . ' &middot; ';
      }
    
      return @links;
    }
    
    =item lastSeen()
    
    lastSeen() returns the users last seen to outanekka.
    
    =cut
    
    sub lastSeen {
      my $limit = shift || 3;
    	
    	if ($limit) {
        my ($sth, $aref);
    
    		$sth = $::dbh->prepare(qq{
    			SELECT user_id
    			FROM $$MODULE\_session GROUP BY user_id ORDER BY MAX(last_seen) DESC LIMIT 0,?
    			}) or warn $::dbh->erstr;
        $sth->execute($limit) or warn $::dbh->errstr;
    
    		$aref = $sth->fetchall_arrayref( {} );
    
        return $aref;
      }
    
    	return undef;
    }
    
    =item lastSeenLinks() 
    
    lastSeenLinks() returns the links of the users last seen to outanekka.
    
    =cut
    
    sub lastSeenLinks {
      my $limit = shift || 3;
      my ($lastSeen, @links);
    	
    	$lastSeen = &lastSeen($limit);
    
      foreach my $user (@{ $lastSeen }) {
        push @links, &user::account::link($user->{'user_id'}) . ' &middot; ';
      }
    
      return @links;
    }
    
    =item hasSession()
    
    hasSession() returns true if the user has a valid session, false otherwise.
    
    =cut
    
    sub hasSession {
      return $$sessionKey ? $$sessionKey : 0;
    }
    
    =item getAccountId()
    
    getAccountId() returns the account ID of the user session.
    
    =cut
    
    sub getAccountId {
      return $$accountId ? $$accountId : 0;
    }
    
    =item getAccountNick() 
    
    getAccountNick() returns the account nick of the user session.
    
    =cut
    
    sub getAccountNick {
      return $$accountNick ? $$accountNick : 0;
    }
    
    =item getAccountLevel()
    
    getAccountLevel() returns the rightslevel of the user session.
    
    =cut
    
    sub getAccountLevel {
      return $$accountLevel ? $$accountLevel : 0;
    }
    
    =head1

  20. imagery::thumb is v0.9.0.16, last edit: 20.07.19.

    6;
    our $LASTEDIT = '20.07.1

  21. imagery::image is v0.9.0.16, last edit: 20.07.21.

    )) {
    	#  $exposure_time = '1

  22. imagery::page is v0.9.0.16, last edit: 20.07.19.

    ;
    
    # vim: noai:sts=2 sw=2 ts=2
    #
    # EOF
    

  23. imagery::album is v0.9.0.16, last edit: 20.07.19.

    2 
    	  return (($thumb), $width, $height, $mime);
    
      } else {
    
        return undef;
      }
    
    	return undef;
    }
    
    =item count()
    
    count()
    
    =cut
    
    sub count {
      my ($count);
    
      $count = $::dbh->selectrow_array(qq{
        SELECT COUNT(*) FROM $$MODULE\_album
    	});
    
      return $count;
    }
    
    =item popular()
    
    popular()
    
    =cut
    
    sub popular {
      my $limit = shift || 3;
    	my $skip = shift || $q->param('skip') || 0;
    
      my $sth;
    
      $sth = $::dbh->prepare(qq{
    		SELECT album_id FROM $$MODULE\_album  
    	  ORDER BY impressions DESC, album_id DESC LIMIT ?,? 
      }) or die $::dbh->erstr;
      $sth->execute($skip, $limit) or die $::dbh->errstr;
      
    	return $sth->fetchall_arrayref({});
    }
    
    ## MAYBE DELETE
    #sub albumsFromPath {
    #  my $path = shift;
    #  my (@albums);
    #  
    #  opendir APATH, $$PATH_ALBUMS . ($path ? $path : '');
    #  
    #  foreach (sort readdir APATH) {
    #    if (/^([^\.].*)$/ && -d $$PATH_ALBUMS . $path . $1

  24. imagery::daily is v0.9.0.12, last edit: 18.05.12.

     SYNOPSIS
    
    A outanekka module.
    
    =head1

  25. imagery::quota is v0.9.0.16, last edit: 20.07.15.

     NAME
    
    imagery::quota.pm
    
    =head1

  26. chatbox::page is v0.9.0.16, last edit: 20.07.14.

    ,
    		            -default=>'',
                    -name=>'chatboxMessage',
                    -maxlength=>$$MESSAGE_MAX) . 
    			$q->end_form();
      } else {
        $o .= $q->div({-style=>'text-align:center; font-style:italic; font-size:smaller;'},
        "Please " . &user::account::loginLink() . " to write messages!");
      }
       
      $sth = $::dbh->prepare(qq{
           	SELECT id, user_id, message FROM $$MODULE ORDER BY id DESC LIMIT ? 
      }) or die $::dbh->errstr;       
      $sth->execute($$SKIP_SLIDER) or die $::dbh->errstr;
       
      while ( my $ref = $sth->fetchrow_hashref ) {
        $messages = &chatbox::message::link($ref->{id}, 
            $ref->{user_id}, 
    		    $ref->{message}) . 
    			($messages ? $messages : "");
      }
         
      if (!$messages) {
        $messages = $q->p($q->i("Yet no chat messages." . $q->br().
            "Be the first to write a chat message!"));
      }
       
      return "\n\n<!-- " . $$MODULE . " :: slider -->\n\n".
        $q->div({-class=>"slider-title"},
          $q->a({-href=>$$REF}, &chatbox::message::count() . ' messages')
        ) .
        $q->div({-class=>"slider-right"},
          $q->p($messages) .
    			$q->p($o)
        );  
    
    }
    
    
    =head1

  27. chatbox::message is v0.9.0.12, last edit: 19.04.28.

     DESCRIPTION
    
    The chatbox module allows authorized users to chat with one another. 
    A superuser can delete entries. 
    In conclution it is - well, a simple chatbox.
    
    =head2 STATUS
    
    The status is considered stable.
    
    =cut
    
    $| = 1

about v0.9.0.12
about::module v0.9.0.16
about::page v0.9.0.16

77642
impressions since May 18, 2019
89 images

5oJfkT.jpeg by adrian, 736 impressions ci_61409.jpeg by moron, 662 impressions mishka-logo.png by adrian, 683 impressions

27 messages

<adrian> Habe ein paar NetBSD Devotionalien hochgeladen:
netbsd
netbsd
<nuser> Schicke Sachen! Wir werden weiter an Outanekka bauen!
<tanam> Saubere Arbeit. Die Userprofile sind nun implementiert.
<adrian> Ja, Bugs bitte an adrian@kiess.onl senden. Danke.
<adrian> ß?üöä -- Umlauttest.
<adrian> öüäß©

Please log in to write messages!

6 users

we welcome
lapsangs · tanam · nuser · remus · moron · adrian · …

recently active
adrian · remus · moron · nuser · tanam · …

new images
adrian · moron · lapsangs · remus ·

outanekka.kiess.onl v0.9.0.16 (2001–2020) by Adrian Immanuel KießBSD licensed
Designed for gecko engine < mozilla.org > ♦ outanekka.kiess.onl usage statistics
Perl code runtime: 0 wallclock secs ( 0.02 usr + 0.01 sys = 0.03 CPU)
2  time    vsz (  diff)    rss (  diff) shared (  diff)   code (  diff)   data (  diff)
     0  97344 ( 97344)  39868 ( 39868)  13104 ( 13104)   1440 (  1440)  26964 ( 26964) after start
     0  97756 (   412)  40396 (   528)  13104 (     0)   1440 (     0)  27376 (   412) near exit