root 4 anni fa
commit
3ff93b9e8f

+ 1002 - 0
Doc/css/base.css

@@ -0,0 +1,1002 @@
+
+:root {
+    /* Typography */
+    --font-primary: 'Source Sans Pro', Helvetica, Arial, sans-serif;
+    --font-secondary: 'Source Sans Pro', Helvetica, Arial, sans-serif;
+    --line-height--primary: 1.6;
+    --letter-spacing--primary: .05rem;
+    --text-base-size: 1em;
+    --text-scale-ratio: 1.2;
+
+    --text-xxs: calc(var(--text-base-size) / var(--text-scale-ratio) / var(--text-scale-ratio) / var(--text-scale-ratio));
+    --text-xs: calc(var(--text-base-size) / var(--text-scale-ratio) / var(--text-scale-ratio));
+    --text-sm: calc(var(--text-base-size) / var(--text-scale-ratio));
+    --text-md: var(--text-base-size);
+    --text-lg: calc(var(--text-base-size) * var(--text-scale-ratio));
+    --text-xl: calc(var(--text-base-size) * var(--text-scale-ratio) * var(--text-scale-ratio));
+    --text-xxl: calc(var(--text-base-size) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio));
+    --text-xxxl: calc(var(--text-base-size) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio));
+    --text-xxxxl: calc(var(--text-base-size) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio));
+    --text-xxxxxl: calc(var(--text-base-size) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio));
+
+    /* Colors */
+    --primary-color: hsl(96, 57%, 60%);
+    --primary-color-darken: hsl(96, 57%, 40%);
+    --primary-color-darker: hsl(96, 57%, 20%);
+    --primary-color-lighten: hsl(96, 57%, 80%);
+    --primary-color-lighter: hsl(96, 57%, 97%);
+    --dark-gray: #d1d1d1;
+    --light-gray: #f0f0f0;
+
+    --text-color: #4b3b40;
+
+    --header-height: var(--spacing-xxxxl);
+    --header-bg-color: var(--primary-color);
+    --code-background-color: #f7faf5;
+    --code-border-color: #d6e7cb;
+    --button-border-color: var(--primary-color-darken);
+    --button-color: transparent;
+    --button-color-primary: var(--primary-color);
+    --button-text-color: #555;
+    --button-text-color-primary: white;
+    --popover-background-color: rgba(255, 255, 255, 0.75);
+    --link-color-primary: var(--primary-color-darken);
+    --link-hover-color-primary: var(--primary-color-darker);
+    --form-field-border-color: var(--dark-gray);
+    --form-field-color: #fff;
+    --admonition-success-color: var(--primary-color);
+    --admonition-border-color: silver;
+    --table-separator-color: var(--primary-color-lighten);
+    --title-text-color: var(--primary-color);
+
+    --sidebar-border-color: var(--primary-color-lighten);
+
+    /* Grid */
+    --container-width: 1400px;
+
+    /* Spacing */
+    --spacing-base-size: 1rem;
+    --spacing-scale-ratio: 1.5;
+
+    --spacing-xxxs: calc(var(--spacing-base-size) / var(--spacing-scale-ratio) / var(--spacing-scale-ratio) / var(--spacing-scale-ratio) / var(--spacing-scale-ratio));
+    --spacing-xxs: calc(var(--spacing-base-size) / var(--spacing-scale-ratio) / var(--spacing-scale-ratio) / var(--spacing-scale-ratio));
+    --spacing-xs: calc(var(--spacing-base-size) / var(--spacing-scale-ratio) / var(--spacing-scale-ratio));
+    --spacing-sm: calc(var(--spacing-base-size) / var(--spacing-scale-ratio));
+    --spacing-md: var(--spacing-base-size);
+    --spacing-lg: calc(var(--spacing-base-size) * var(--spacing-scale-ratio));
+    --spacing-xl: calc(var(--spacing-base-size) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio));
+    --spacing-xxl: calc(var(--spacing-base-size) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio));
+    --spacing-xxxl: calc(var(--spacing-base-size) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio));
+    --spacing-xxxxl: calc(var(--spacing-base-size) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio));
+
+    --border-radius-base-size: 3px;
+}
+
+/* Base Styles
+-------------------------------------------------- */
+body {
+    color: var(--text-color);
+    font-family: var(--font-primary);
+    font-size: var(--text-md);
+    letter-spacing: var(--letter-spacing--primary);
+    line-height: var(--line-height--primary);
+}
+
+.phpdocumentor h1,
+.phpdocumentor h2,
+.phpdocumentor h3,
+.phpdocumentor h4,
+.phpdocumentor h5,
+.phpdocumentor h6 {
+    margin-bottom: var(--spacing-lg);
+    margin-top: var(--spacing-lg);
+    font-weight: 600;
+}
+
+.phpdocumentor h1 {
+    font-size: var(--text-xxxxl);
+    letter-spacing: var(--letter-spacing--primary);
+    line-height: 1.2;
+    margin-top: 0;
+}
+
+.phpdocumentor h2 {
+    font-size: var(--text-xxxl);
+    letter-spacing: var(--letter-spacing--primary);
+    line-height: 1.25;
+    margin-top: 0;
+}
+
+.phpdocumentor h3 {
+    font-size: var(--text-xxl);
+    letter-spacing: var(--letter-spacing--primary);
+    line-height: 1.3;
+}
+
+.phpdocumentor h4 {
+    font-size: var(--text-xl);
+    letter-spacing: calc(var(--letter-spacing--primary) / 2);
+    line-height: 1.35;
+    margin-bottom: var(--spacing-md);
+}
+
+.phpdocumentor h5 {
+    font-size: var(--text-lg);
+    letter-spacing: calc(var(--letter-spacing--primary) / 4);
+    line-height: 1.5;
+    margin-bottom: var(--spacing-md);
+    margin-top: var(--spacing-md);
+}
+
+.phpdocumentor h6 {
+    font-size: var(--text-md);
+    letter-spacing: 0;
+    line-height: var(--line-height--primary);
+    margin-bottom: var(--spacing-md);
+    margin-top: var(--spacing-md);
+}
+
+.phpdocumentor h1 .headerlink,
+.phpdocumentor h2 .headerlink,
+.phpdocumentor h3 .headerlink,
+.phpdocumentor h4 .headerlink,
+.phpdocumentor h5 .headerlink,
+.phpdocumentor h6 .headerlink
+{
+    transition: all .3s ease-in-out;
+    opacity: 0;
+    text-decoration: none;
+    color: silver;
+    font-size: 80%;
+}
+
+.phpdocumentor h1:hover .headerlink,
+.phpdocumentor h2:hover .headerlink,
+.phpdocumentor h3:hover .headerlink,
+.phpdocumentor h4:hover .headerlink,
+.phpdocumentor h5:hover .headerlink,
+.phpdocumentor h6:hover .headerlink
+{
+    opacity: 1;
+}
+.phpdocumentor p {
+    margin-top: 0;
+    margin-bottom: var(--spacing-md);
+}
+.phpdocumentor figure {
+    margin-bottom: var(--spacing-md);
+}
+.phpdocumentor-line {
+    border-top: 1px solid #E1E1E1;
+    border-width: 0;
+    margin-bottom: var(--spacing-xxl);
+    margin-top: var(--spacing-xxl);
+}
+.phpdocumentor-section {
+    box-sizing: border-box;
+    margin: 0 auto;
+    max-width: var(--container-width);
+    padding: 0 var(--spacing-lg);
+    position: relative;
+    width: 100%;
+}
+
+@media (min-width: 1200px) {
+    .phpdocumentor-section {
+        padding: 0;
+        width: 95%;
+    }
+}
+.phpdocumentor-column {
+    box-sizing: border-box;
+    float: left;
+    width: 100%;
+}
+
+@media (min-width: 550px) {
+    .phpdocumentor-column {
+        margin-left: 4%;
+    }
+
+    .phpdocumentor-column:first-child {
+        margin-left: 0;
+    }
+
+    .-one.phpdocumentor-column {
+        width: 4.66666666667%;
+    }
+
+    .-two.phpdocumentor-column {
+        width: 13.3333333333%;
+    }
+
+    .-three.phpdocumentor-column {
+        width: 22%;
+    }
+
+    .-four.phpdocumentor-column {
+        width: 30.6666666667%;
+    }
+
+    .-five.phpdocumentor-column {
+        width: 39.3333333333%;
+    }
+
+    .-six.phpdocumentor-column {
+        width: 48%;
+    }
+
+    .-seven.phpdocumentor-column {
+        width: 56.6666666667%;
+    }
+
+    .-eight.phpdocumentor-column {
+        width: 65.3333333333%;
+    }
+
+    .-nine.phpdocumentor-column {
+        width: 74.0%;
+    }
+
+    .-ten.phpdocumentor-column {
+        width: 82.6666666667%;
+    }
+
+    .-eleven.phpdocumentor-column {
+        width: 91.3333333333%;
+    }
+
+    .-twelve.phpdocumentor-column {
+        margin-left: 0;
+        width: 100%;
+    }
+
+    .-one-third.phpdocumentor-column {
+        width: 30.6666666667%;
+    }
+
+    .-two-thirds.phpdocumentor-column {
+        width: 65.3333333333%;
+    }
+
+    .-one-half.phpdocumentor-column {
+        width: 48%;
+    }
+
+    /* Offsets */
+    .-offset-by-one.phpdocumentor-column {
+        margin-left: 8.66666666667%;
+    }
+
+    .-offset-by-two.phpdocumentor-column {
+        margin-left: 17.3333333333%;
+    }
+
+    .-offset-by-three.phpdocumentor-column {
+        margin-left: 26%;
+    }
+
+    .-offset-by-four.phpdocumentor-column {
+        margin-left: 34.6666666667%;
+    }
+
+    .-offset-by-five.phpdocumentor-column {
+        margin-left: 43.3333333333%;
+    }
+
+    .-offset-by-six.phpdocumentor-column {
+        margin-left: 52%;
+    }
+
+    .-offset-by-seven.phpdocumentor-column {
+        margin-left: 60.6666666667%;
+    }
+
+    .-offset-by-eight.phpdocumentor-column {
+        margin-left: 69.3333333333%;
+    }
+
+    .-offset-by-nine.phpdocumentor-column {
+        margin-left: 78.0%;
+    }
+
+    .-offset-by-ten.phpdocumentor-column {
+        margin-left: 86.6666666667%;
+    }
+
+    .-offset-by-eleven.phpdocumentor-column {
+        margin-left: 95.3333333333%;
+    }
+
+    .-offset-by-one-third.phpdocumentor-column {
+        margin-left: 34.6666666667%;
+    }
+
+    .-offset-by-two-thirds.phpdocumentor-column {
+        margin-left: 69.3333333333%;
+    }
+
+    .-offset-by-one-half.phpdocumentor-column {
+        margin-left: 52%;
+    }
+}
+.phpdocumentor a {
+    color: var(--link-color-primary);
+}
+
+.phpdocumentor a:hover {
+    color: var(--link-hover-color-primary);
+}
+.phpdocumentor-button {
+    background-color: var(--button-color);
+    border: 1px solid var(--button-border-color);
+    border-radius: var(--border-radius-base-size);
+    box-sizing: border-box;
+    color: var(--button-text-color);
+    cursor: pointer;
+    display: inline-block;
+    font-size: var(--text-sm);
+    font-weight: 600;
+    height: 38px;
+    letter-spacing: .1rem;
+    line-height: 38px;
+    padding: 0 var(--spacing-xxl);
+    text-align: center;
+    text-decoration: none;
+    text-transform: uppercase;
+    white-space: nowrap;
+    margin-bottom: var(--spacing-md);
+}
+
+.phpdocumentor-button .-wide {
+    width: 100%;
+}
+
+.phpdocumentor-button:hover,
+.phpdocumentor-button:focus {
+    border-color: #888;
+    color: #333;
+    outline: 0;
+}
+
+.phpdocumentor-button.-primary {
+    background-color: var(--button-color-primary);
+    border-color: var(--button-color-primary);
+    color: var(--button-text-color-primary);
+}
+
+.phpdocumentor-button.-primary:hover,
+.phpdocumentor-button.-primary:focus {
+    background-color: var(--link-color-primary);
+    border-color: var(--link-color-primary);
+    color: var(--button-text-color-primary);
+}
+.phpdocumentor form {
+    margin-bottom: var(--spacing-md);
+}
+
+.phpdocumentor-field {
+    background-color: var(--form-field-color);
+    border: 1px solid var(--form-field-border-color);
+    border-radius: var(--border-radius-base-size);
+    box-shadow: none;
+    box-sizing: border-box;
+    height: 38px;
+    padding: var(--spacing-xxxs) var(--spacing-xxs); /* The 6px vertically centers text on FF, ignored by Webkit */
+    margin-bottom: var(--spacing-md);
+}
+
+/* Removes awkward default styles on some inputs for iOS */
+input[type="email"],
+input[type="number"],
+input[type="search"],
+input[type="text"],
+input[type="tel"],
+input[type="url"],
+input[type="password"],
+textarea {
+    -moz-appearance: none;
+    -webkit-appearance: none;
+    appearance: none;
+}
+
+.phpdocumentor-textarea {
+    min-height: 65px;
+    padding-bottom: var(--spacing-xxxs);
+    padding-top: var(--spacing-xxxs);
+}
+
+.phpdocumentor-field:focus {
+    border: 1px solid var(--button-color-primary);
+    outline: 0;
+}
+
+.phpdocumentor-label {
+    display: block;
+    margin-bottom: var(--spacing-xs);
+}
+
+.phpdocumentor-fieldset {
+    border-width: 0;
+    padding: 0;
+}
+
+input[type="checkbox"].phpdocumentor-field,
+input[type="radio"].phpdocumentor-field {
+    display: inline;
+}
+div.phpdocumentor-list > ul,
+ul.phpdocumentor-list {
+    list-style: circle inside;
+}
+
+ol.phpdocumentor-list {
+    list-style: decimal inside;
+}
+
+div.phpdocumentor-list > ul,
+ol.phpdocumentor-list,
+ul.phpdocumentor-list {
+    margin-top: 0;
+    padding-left: 0;
+    margin-bottom: var(--spacing-md);
+}
+
+dl {
+    margin-bottom: var(--spacing-md);
+}
+
+div.phpdocumentor-list > ul ul,
+ul.phpdocumentor-list ul.phpdocumentor-list,
+ul.phpdocumentor-list ol.phpdocumentor-list,
+ol.phpdocumentor-list ol.phpdocumentor-list,
+ol.phpdocumentor-list ul.phpdocumentor-list {
+    font-size: var(--text-sm);
+    margin: var(--spacing-xs) 0 var(--spacing-xs) calc(var(--spacing-xs) * 2);
+}
+
+li.phpdocumentor-list {
+    margin-bottom: var(--spacing-md);
+}
+.phpdocumentor pre {
+    margin-bottom: var(--spacing-md);
+}
+
+.phpdocumentor-code {
+    background: var(--code-background-color);
+    border: 1px solid var(--code-border-color);
+    border-radius: var(--border-radius-base-size);
+    font-size: var(--text-sm);
+    padding: var(--spacing-sm) var(--spacing-md);
+    width: 100%;
+    box-sizing: border-box;
+}
+
+pre > .phpdocumentor-code {
+    display: block;
+    white-space: pre;
+}
+.phpdocumentor blockquote {
+    border-left: 4px solid var(--primary-color);
+    margin: var(--spacing-md) 0;
+    padding: var(--spacing-xs) var(--spacing-sm);
+    color: var(--primary-color-darker);
+    font-style: italic;
+    font-size: var(--text-sm);
+}
+.phpdocumentor table {
+    margin-bottom: var(--spacing-md);
+}
+
+th.phpdocumentor-heading,
+td.phpdocumentor-cell {
+    border-bottom: 1px solid var(--table-separator-color);
+    padding: var(--spacing-sm) var(--spacing-md);
+    text-align: left;
+}
+
+th.phpdocumentor-heading:first-child,
+td.phpdocumentor-cell:first-child {
+    padding-left: 0;
+}
+
+th.phpdocumentor-heading:last-child,
+td.phpdocumentor-cell:last-child {
+    padding-right: 0;
+}
+
+.phpdocumentor-header {
+    display: flex;
+    flex-direction: row;
+    align-items: stretch;
+    flex-wrap: wrap;
+    justify-content: space-between;
+    height: auto;
+    padding: var(--spacing-md) var(--spacing-md);
+}
+
+.phpdocumentor-header__menu-button {
+    position: absolute;
+    top: -100%;
+    left: -100%;
+}
+
+.phpdocumentor-header__menu-icon {
+    font-size: 2rem;
+    color: var(--primary-color);
+}
+
+.phpdocumentor-header__menu-button:checked ~ .phpdocumentor-topnav {
+    max-height: 250px;
+    padding-top: var(--spacing-md);
+}
+
+@media (min-width: 1000px) {
+    .phpdocumentor-header {
+        flex-direction: row;
+        padding: var(--spacing-lg) var(--spacing-lg);
+        min-height: var(--header-height);
+    }
+
+    .phpdocumentor-header__menu-icon {
+        display: none;
+    }
+}
+
+@media (min-width: 1000px) {
+    .phpdocumentor-header {
+        padding-top: 0;
+        padding-bottom: 0;
+    }
+}
+@media (min-width: 1200px) {
+    .phpdocumentor-header {
+        padding: 0;
+    }
+}
+.phpdocumentor-title {
+    box-sizing: border-box;
+    color: var(--title-text-color);
+    font-size: var(--text-xxl);
+    letter-spacing: .05rem;
+    font-weight: normal;
+    width: auto;
+    margin: 0;
+    display: flex;
+    align-items: center;
+}
+
+.phpdocumentor-title.-without-divider {
+    border: none;
+}
+
+.phpdocumentor-title__link {
+    transition: all .3s ease-out;
+    display: flex;
+    color: var(--title-text-color);
+    text-decoration: none;
+    font-weight: normal;
+    white-space: nowrap;
+    transform: scale(.75);
+    transform-origin: left;
+}
+
+.phpdocumentor-title__link:hover {
+    transform: perspective(15rem) translateX(.5rem);
+    font-weight: 600;
+}
+
+@media (min-width: 1000px) {
+    .phpdocumentor-title {
+        width: 30.6666666667%;
+        border-right: var(--sidebar-border-color) solid 1px;
+    }
+
+    .phpdocumentor-title__link {
+        transform-origin: left;
+    }
+}
+
+@media (min-width: 1000px) {
+    .phpdocumentor-title__link {
+        transform: scale(.85);
+    }
+}
+
+@media (min-width: 1200px) {
+    .phpdocumentor-title__link {
+        transform: scale(1);
+    }
+}
+.phpdocumentor-topnav {
+    display: flex;
+    align-items: center;
+    margin: 0;
+    max-height: 0;
+    overflow: hidden;
+    transition: max-height 0.2s ease-out;
+    flex-basis: 100%;
+}
+
+.phpdocumentor-topnav__menu {
+    text-align: right;
+    list-style: none;
+    margin: 0;
+    padding: 0;
+    flex: 1;
+    display: flex;
+    flex-flow: row wrap;
+    justify-content: center;
+}
+
+.phpdocumentor-topnav__menu-item {
+    margin: 0;
+    width: 100%;
+    display: inline-block;
+    text-align: center;
+    padding: var(--spacing-sm) 0
+}
+
+.phpdocumentor-topnav__menu-item.-social {
+    width: auto;
+    padding: var(--spacing-sm)
+}
+
+.phpdocumentor-topnav__menu-item a {
+    display: inline-block;
+    color: var(--text-color);
+    text-decoration: none;
+    font-size: var(--text-lg);
+    transition: all .3s ease-out;
+    border-bottom: 1px dotted transparent;
+    line-height: 1;
+}
+
+.phpdocumentor-topnav__menu-item a:hover {
+    transform: perspective(15rem) translateY(.1rem);
+    border-bottom: 1px dotted var(--text-color);
+}
+
+@media (min-width: 1000px) {
+    .phpdocumentor-topnav {
+        max-height: none;
+        overflow: visible;
+        flex-basis: auto;
+    }
+
+    .phpdocumentor-topnav__menu {
+        display: flex;
+        flex-flow: row wrap;
+        justify-content: flex-end;
+    }
+
+    .phpdocumentor-topnav__menu-item,
+    .phpdocumentor-topnav__menu-item.-social {
+        width: auto;
+        display: inline;
+        text-align: right;
+        padding: 0 0 0 var(--spacing-md)
+    }
+}
+.phpdocumentor-sidebar {
+    margin: 0;
+    overflow: hidden;
+    max-height: 0;
+}
+
+.phpdocumentor .phpdocumentor-sidebar .phpdocumentor-list {
+    padding-top: var(--spacing-xs);
+    padding-left: var(--spacing-md);
+    list-style: none;
+}
+
+.phpdocumentor .phpdocumentor-sidebar li {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    padding: 0 0 var(--spacing-xxxs) var(--spacing-md);
+}
+
+.phpdocumentor .phpdocumentor-sidebar abbr,
+.phpdocumentor .phpdocumentor-sidebar a {
+    text-decoration: none;
+    border-bottom: none;
+    color: var(--text-color);
+    font-size: var(--text-md);
+    padding-left: 0;
+    transition: padding-left .4s ease-out;
+}
+
+.phpdocumentor .phpdocumentor-sidebar a:hover {
+    padding-left: 5px;
+    font-weight: 600;
+}
+
+.phpdocumentor .phpdocumentor-sidebar__category > * {
+    border-left: 1px solid var(--primary-color-lighten);
+}
+
+.phpdocumentor .phpdocumentor-sidebar__category {
+    margin-bottom: var(--spacing-lg);
+}
+
+.phpdocumentor .phpdocumentor-sidebar__category-header {
+    font-size: var(--text-md);
+    margin-bottom: var(--spacing-xs);
+    color: var(--link-color-primary);
+    font-weight: 600;
+    border-left: 0;
+}
+
+.phpdocumentor .phpdocumentor-sidebar__root-package,
+.phpdocumentor .phpdocumentor-sidebar__root-namespace {
+    font-size: var(--text-md);
+    margin: 0;
+    padding-top: var(--spacing-xs);
+    padding-left: var(--spacing-md);
+    color: var(--text-color);
+    font-weight: normal;
+}
+
+@media (min-width: 550px) {
+    .phpdocumentor-sidebar {
+        border-right: var(--sidebar-border-color) solid 1px;
+    }
+}
+
+.phpdocumentor-sidebar__menu-button {
+    position: absolute;
+    top: -100%;
+    left: -100%;
+}
+
+.phpdocumentor-sidebar__menu-icon {
+    font-size: var(--text-md);
+    font-weight: 600;
+    background: var(--primary-color);
+    color: white;
+    margin: 0 0 var(--spacing-lg);
+    display: block;
+    padding: var(--spacing-sm);
+    text-align: center;
+    border-radius: 3px;
+    text-transform: uppercase;
+    letter-spacing: .15rem;
+}
+
+.phpdocumentor-sidebar__menu-button:checked ~ .phpdocumentor-sidebar {
+    max-height: 100%;
+    padding-top: var(--spacing-md);
+}
+
+@media (min-width: 550px) {
+    .phpdocumentor-sidebar {
+        overflow: visible;
+        max-height: 100%;
+    }
+
+    .phpdocumentor-sidebar__menu-icon {
+        display: none;
+    }
+}
+.phpdocumentor-admonition {
+    border: 1px solid var(--admonition-border-color);
+    border-radius: var(--border-radius-base-size);
+    border-color: var(--primary-color-lighten);
+    background-color: var(--primary-color-lighter);
+    font-size: 85%;
+    padding: .5rem;
+    margin: 2rem 0;
+    display: flex;
+    flex-direction: row;
+}
+
+.phpdocumentor-admonition--success {
+    border-color: var(--admonition-success-color);
+}
+
+.phpdocumentor-admonition__icon {
+    font-size: 2rem;
+    margin: .75rem 0.75rem 1.25rem 0.5rem;
+    color: var(--primary-color);
+}
+.phpdocumentor ul.phpdocumentor-breadcrumbs {
+    font-size: var(--text-md);
+    list-style: none;
+    margin: 0;
+    padding: 0;
+}
+
+.phpdocumentor ul.phpdocumentor-breadcrumbs a {
+    color: var(--text-color);
+    text-decoration: none;
+}
+
+.phpdocumentor ul.phpdocumentor-breadcrumbs > li {
+    display: inline-block;
+    margin: 0;
+}
+
+.phpdocumentor ul.phpdocumentor-breadcrumbs > li + li:before {
+    color: var(--dark-gray);
+    content: "\\\A0";
+    padding: 0;
+}
+.phpdocumentor .phpdocumentor-back-to-top {
+    position: fixed;
+    bottom: 2rem;
+    font-size: 2.5rem;
+    opacity: .25;
+    transition: all .3s ease-in-out;
+    right: 2rem;
+}
+
+.phpdocumentor .phpdocumentor-back-to-top:hover {
+    color: var(--link-color-primary);
+    opacity: 1;
+}
+.phpdocumentor-search {
+    position: relative;
+    display: none; /** disable by default for non-js flow */
+    opacity: .3; /** white-out default for loading indication */
+    transition: opacity .3s, background .3s;
+    margin: var(--spacing-sm) 0;
+    flex: 1;
+    min-width: 100%;
+}
+
+.phpdocumentor-search label {
+    display: flex;
+    align-items: center;
+    flex: 1;
+}
+
+.phpdocumentor-search__icon {
+    color: var(--primary-color);
+    margin-right: var(--spacing-sm);
+    width: 1rem;
+    height: 1rem;
+}
+
+.phpdocumentor-search--enabled {
+    display: flex;
+}
+
+.phpdocumentor-search--active {
+    opacity: 1;
+}
+
+.phpdocumentor-search input:disabled {
+    background-color: lightgray;
+}
+
+.phpdocumentor-search__field:focus,
+.phpdocumentor-search__field {
+    margin-bottom: 0;
+    border: 0;
+    border-bottom: 2px solid var(--primary-color);
+    padding: 0;
+    border-radius: 0;
+    flex: 1;
+}
+
+@media (min-width: 1000px) {
+    .phpdocumentor-search {
+        min-width: auto;
+        max-width: 20rem;
+        margin: 0 0 0 auto;
+    }
+}
+.phpdocumentor-content {
+    position: relative;
+}
+
+.phpdocumentor-search-results {
+    backdrop-filter: blur(5px);
+    background: var(--popover-background-color);
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    padding: 0;
+    opacity: 1;
+    pointer-events: all;
+
+    transition: opacity .3s, background .3s;
+}
+
+.phpdocumentor-search-results--hidden {
+    background: transparent;
+    backdrop-filter: blur(0);
+    opacity: 0;
+    pointer-events: none;
+}
+
+.phpdocumentor-search-results__dialog {
+    width: 100%;
+    background: white;
+    max-height: 100%;
+    display: flex;
+    flex-direction: column;
+}
+
+.phpdocumentor-search-results__body {
+    overflow: auto;
+}
+
+.phpdocumentor-search-results__header {
+    padding: var(--spacing-lg);
+    display: flex;
+    justify-content: space-between;
+    background: var(--primary-color-darken);
+    color: white;
+    align-items: center;
+}
+
+.phpdocumentor-search-results__close {
+    font-size: var(--text-xl);
+    background: none;
+    border: none;
+    padding: 0;
+    margin: 0;
+}
+
+.phpdocumentor  .phpdocumentor-search-results__title {
+    font-size: var(--text-xl);
+    margin-bottom: 0;
+}
+
+.phpdocumentor-search-results__entries {
+    list-style: none;
+    padding: 0 var(--spacing-lg);
+    margin: 0;
+}
+
+.phpdocumentor-search-results__entry {
+    border-bottom: 1px solid var(--table-separator-color);
+    padding: var(--spacing-sm) 0;
+    text-align: left;
+}
+
+.phpdocumentor-search-results__entry a {
+    display: block;
+}
+
+.phpdocumentor-search-results__entry small {
+    margin-top: var(--spacing-xs);
+    margin-bottom: var(--spacing-md);
+    color: var(--primary-color-darker);
+    display: block;
+    word-break: break-word;
+}
+
+.phpdocumentor-search-results__entry h3 {
+    font-size: var(--text-lg);
+    margin: 0;
+}
+
+@media (min-width: 550px) {
+    .phpdocumentor-search-results {
+        padding: 0 var(--spacing-lg);
+    }
+
+    .phpdocumentor-search-results__entry h3 {
+        font-size: var(--text-xxl);
+    }
+
+    .phpdocumentor-search-results__dialog {
+        margin: var(--spacing-xl) auto;
+        max-width: 40rem;
+        background: white;
+        border: 1px solid silver;
+        box-shadow: 0 2px 5px silver;
+        max-height: 40rem;
+        border-radius: 3px;
+    }
+}
+
+/* Used for screen readers and such */
+.visually-hidden {
+    display: none;
+}

+ 427 - 0
Doc/css/normalize.css

@@ -0,0 +1,427 @@
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ *    user zoom.
+ */
+
+html {
+    font-family: sans-serif; /* 1 */
+    -ms-text-size-adjust: 100%; /* 2 */
+    -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+    margin: 0;
+}
+
+/* HTML5 display definitions
+   ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
+ * and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+    display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+    display: inline-block; /* 1 */
+    vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+    display: none;
+    height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+    display: none;
+}
+
+/* Links
+   ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+    background-color: transparent;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+    outline: 0;
+}
+
+/* Text-level semantics
+   ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+    border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+    font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+    font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+    font-size: 2em;
+    margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+    background: #ff0;
+    color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+    font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+    font-size: 75%;
+    line-height: 0;
+    position: relative;
+    vertical-align: baseline;
+}
+
+sup {
+    top: -0.5em;
+}
+
+sub {
+    bottom: -0.25em;
+}
+
+/* Embedded content
+   ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+    border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+    overflow: hidden;
+}
+
+/* Grouping content
+   ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+    margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+    -moz-box-sizing: content-box;
+    box-sizing: content-box;
+    height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+    overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+    font-family: monospace, monospace;
+    font-size: 1em;
+}
+
+/* Forms
+   ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ *    Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+    color: inherit; /* 1 */
+    font: inherit; /* 2 */
+    margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+    overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+    text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ *    and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ *    `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+    -webkit-appearance: button; /* 2 */
+    cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+    cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+    border: 0;
+    padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+    line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+    box-sizing: border-box; /* 1 */
+    padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+    height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
+ *    (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+    -webkit-appearance: textfield; /* 1 */
+    -moz-box-sizing: content-box;
+    -webkit-box-sizing: content-box; /* 2 */
+    box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+    -webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+    border: 1px solid #c0c0c0;
+    margin: 0 2px;
+    padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+    border: 0; /* 1 */
+    padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+    overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+    font-weight: bold;
+}
+
+/* Tables
+   ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+    border-collapse: collapse;
+    border-spacing: 0;
+}
+
+td,
+th {
+    padding: 0;
+}

+ 169 - 0
Doc/css/template.css

@@ -0,0 +1,169 @@
+.phpdocumentor-summary {
+    font-style: italic;
+}
+.phpdocumentor-description {
+    margin-bottom: var(--spacing-md);
+}
+.phpdocumentor-element {
+    position: relative;
+}
+
+.phpdocumentor .phpdocumentor-element__name {
+    line-height: 1;
+}
+
+.phpdocumentor-element__package,
+.phpdocumentor-element__extends,
+.phpdocumentor-element__implements {
+    display: block;
+    font-size: var(--text-xxs);
+    font-weight: normal;
+    opacity: .7;
+}
+
+.phpdocumentor-element__package .phpdocumentor-breadcrumbs {
+    display: inline;
+}
+
+.phpdocumentor-element:not(:last-child) {
+    border-bottom: 1px solid var(--primary-color-lighten);
+    padding-bottom: var(--spacing-lg);
+}
+
+.phpdocumentor-element.-deprecated .phpdocumentor-element__name {
+    text-decoration: line-through;
+}
+
+.phpdocumentor-element__modifier {
+    font-size: var(--text-xxs);
+    padding: calc(var(--spacing-base-size) / 4) calc(var(--spacing-base-size) / 2);
+    color: var(--text-color);
+    background-color: var(--light-gray);
+    border-radius: 3px;
+    text-transform: uppercase;
+}
+.phpdocumentor-signature {
+    display: inline-block;
+    font-size: var(--text-sm);
+    margin-bottom: var(--spacing-md);
+}
+
+.phpdocumentor-signature.-deprecated .phpdocumentor-signature__name {
+    text-decoration: line-through;
+}
+.phpdocumentor-table-of-contents {
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry {
+    padding-top: var(--spacing-xs);
+    margin-left: 2rem;
+    display: flex;
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry > a {
+    flex: 0 1 auto;
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry > span {
+    flex: 1;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry:after {
+    content: '';
+    height: 12px;
+    width: 12px;
+    left: 16px;
+    position: absolute;
+}
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-private:after {
+    background: url('data:image/svg+xml;utf8,<svg width="8" height="10" viewBox="0 0 8 10" fill="none" xmlns="http://www.w3.org/2000/svg"><rect y="4" width="8" height="6" rx="1.4" fill="%23EE6749"/><path d="M2 4C2 3 2.4 1 4 1C5.6 1 6 3 6 4" stroke="%23EE6749" stroke-width="1.4"/></svg>') no-repeat;
+}
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-protected:after {
+    left: 13px;
+    background: url('data:image/svg+xml;utf8,<svg width="11" height="9" viewBox="0 0 11 9" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="3" y="3" width="8" height="6" rx="1.4" fill="%23EE9949"/><path d="M5 4C5 3 4.6 1 3 1C1.4 1 1 3 1 4" stroke="%23EE9949" stroke-width="1.4"/></svg>') no-repeat;
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry:before {
+    width: 1.25rem;
+    height: 1.25rem;
+    line-height: 1.25rem;
+    background: transparent url('data:image/svg+xml;utf8,<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="10" fill="%238DD35F"/></svg>') no-repeat center center;
+    content: '';
+    position: absolute;
+    left: 0;
+    border-radius: 50%;
+    font-weight: 600;
+    color: white;
+    text-align: center;
+    font-size: .75rem;
+    margin-top: .2rem;
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-method:before {
+    content: 'M';
+    background-image: url('data:image/svg+xml;utf8,<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="10" fill="%238DD35F"/></svg>');
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-function:before {
+    content: 'M';
+    background-image: url('data:image/svg+xml;utf8,<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="10" fill="%238DD35F"/></svg>');
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-property:before {
+    content: 'P'
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-constant:before {
+    content: 'C';
+    background-color: transparent;
+    background-image: url('data:image/svg+xml;utf8,<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="-3.05176e-05" y="9.99998" width="14.1422" height="14.1422" transform="rotate(-45 -3.05176e-05 9.99998)" fill="%238DD35F"/></svg>');
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-class:before {
+    content: 'C'
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-interface:before {
+    content: 'I'
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-trait:before {
+    content: 'T'
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-namespace:before {
+    content: 'N'
+}
+
+.phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-package:before {
+    content: 'P'
+}
+
+.phpdocumentor-table-of-contents dd {
+    font-style: italic;
+    margin-left: 2rem;
+}
+.phpdocumentor-element-found-in {
+    position: absolute;
+    top: 0;
+    right: 0;
+    font-size: var(--text-sm);
+    color: gray;
+}
+.phpdocumentor-class-graph {
+    width: 100%; height: 600px; border:1px solid black; overflow: hidden
+}
+
+.phpdocumentor-class-graph__graph {
+    width: 100%;
+}
+.phpdocumentor-tag-list__definition {
+    display: flex;
+}
+
+.phpdocumentor-tag-link {
+    margin-right: var(--spacing-sm);
+}

+ 820 - 0
Doc/files/seafile.html

@@ -0,0 +1,820 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title>Documentation</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <base href="../">
+    <link rel="icon" href="images/favicon.ico"/>
+    <link rel="stylesheet" href="css/normalize.css">
+    <link rel="stylesheet" href="css/base.css">
+            <link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap" rel="stylesheet">
+        <link rel="stylesheet" href="css/template.css">
+        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/css/all.min.css" integrity="sha256-ybRkN9dBjhcS2qrW1z+hfCxq+1aBdwyQM5wlQoQVt/0=" crossorigin="anonymous" />
+                <script src="https://cdn.jsdelivr.net/npm/fuse.js@3.4.6"></script>
+        <script src="https://cdn.jsdelivr.net/npm/css-vars-ponyfill@2"></script>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/js/all.min.js" integrity="sha256-0vuk8LXoyrmCjp1f0O300qo1M75ZQyhH9X3J6d+scmk=" crossorigin="anonymous"></script>
+        <script src="js/search.js"></script>
+        <script defer src="js/searchIndex.js"></script>
+    </head>
+<body id="top">
+    <header class="phpdocumentor-header phpdocumentor-section">
+    <h1 class="phpdocumentor-title"><a href="" class="phpdocumentor-title__link">Documentation</a></h1>
+    <input class="phpdocumentor-header__menu-button" type="checkbox" id="menu-button" name="menu-button" />
+    <label class="phpdocumentor-header__menu-icon" for="menu-button">
+        <i class="fas fa-bars"></i>
+    </label>
+    <section data-search-form class="phpdocumentor-search">
+    <label>
+        <span class="visually-hidden">Search for</span>
+        <svg class="phpdocumentor-search__icon" width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+            <circle cx="7.5" cy="7.5" r="6.5" stroke="currentColor" stroke-width="2"/>
+            <line x1="12.4892" y1="12.2727" x2="19.1559" y2="18.9393" stroke="currentColor" stroke-width="3"/>
+        </svg>
+        <input type="search" class="phpdocumentor-field phpdocumentor-search__field" placeholder="Loading .." disabled />
+    </label>
+</section>
+
+    <nav class="phpdocumentor-topnav">
+    <ul class="phpdocumentor-topnav__menu">
+        </ul>
+</nav>
+</header>
+
+    <main class="phpdocumentor">
+        <div class="phpdocumentor-section">
+            <input class="phpdocumentor-sidebar__menu-button" type="checkbox" id="sidebar-button" name="sidebar-button" />
+<label class="phpdocumentor-sidebar__menu-icon" for="sidebar-button">
+    Menu
+</label>
+<aside class="phpdocumentor-column -four phpdocumentor-sidebar">
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Namespaces</h2>
+                                <h3 class="phpdocumentor-sidebar__root-namespace"><a href="namespaces/default.html"><abbr title="\">Global</abbr></a></h3>
+                                    </section>
+
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Reports</h2>
+                <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/deprecated.html">Deprecated</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/errors.html">Errors</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/markers.html">Markers</a></h3>
+    </section>
+
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Indices</h2>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="indices/files.html">Files</a></h3>
+    </section>
+</aside>
+
+            <div class="phpdocumentor-column -eight phpdocumentor-content">
+                    <ul class="phpdocumentor-breadcrumbs">
+            <li class="phpdocumentor-breadcrumb"><a href="packages/Default.html">Default</a></li>
+    </ul>
+
+    <article class="phpdocumentor-element -file">
+        <h2 class="phpdocumentor-content__title">seafile.php</h2>
+
+        
+
+
+
+<h3 id="toc">
+    Table of Contents
+    <a href="#toc" class="headerlink"><i class="fas fa-link"></i></a>
+</h3>
+
+<dl class="phpdocumentor-table-of-contents">
+                        <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_MetaData">seafile_MetaData()</a>
+    <span>
+                        &nbsp;: mixed    </span>
+</dt>
+<dd></dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ConfigOptions">seafile_ConfigOptions()</a>
+    <span>
+                        &nbsp;: array&lt;string|int, mixed&gt;    </span>
+</dt>
+<dd>Define SeaFile product configuration options.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_TestConnection">seafile_TestConnection()</a>
+    <span>
+                        &nbsp;: array&lt;string|int, mixed&gt;    </span>
+</dt>
+<dd>Test connection to a SeaFile server with the given server parameters.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_UsageUpdate">seafile_UsageUpdate()</a>
+    <span>
+                        &nbsp;: mixed    </span>
+</dt>
+<dd>Usage Update</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ClientArea">seafile_ClientArea()</a>
+    <span>
+                        &nbsp;: array&lt;string|int, mixed&gt;    </span>
+</dt>
+<dd>Client area output logic handling.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ChangePassword">seafile_ChangePassword()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Change the password for a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ChangePackage">seafile_ChangePackage()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Set a new quota of a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_CreateAccount">seafile_CreateAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Provision a new instance of a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_SuspendAccount">seafile_SuspendAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Set a SeaFile account to status inactive.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_UnsuspendAccount">seafile_UnsuspendAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Set a SeaFile account to status active.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_TerminateAccount">seafile_TerminateAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Removes a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafileCheckPassword">seafileCheckPassword()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>server side password check</dd>
+
+    </dl>
+
+
+        
+
+            <section class="phpdocumentor-functions">
+        <h3 class="phpdocumentor-elements__header" id="functions">
+            Functions
+            <a href="files/seafile.html#functions" class="headerlink"><i class="fas fa-link"></i></a>
+        </h3>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_MetaData">
+        seafile_MetaData()
+        <a href="namespaces/default.html#function_seafile_MetaData" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">18</span>
+</aside>
+
+    
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_MetaData</span><span>(</span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">mixed</span></code>
+
+    
+    
+    
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ConfigOptions">
+        seafile_ConfigOptions()
+        <a href="namespaces/default.html#function_seafile_ConfigOptions" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">40</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Define SeaFile product configuration options.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ConfigOptions</span><span>(</span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">array&lt;string|int, mixed&gt;</span></code>
+
+        <section class="phpdocumentor-description"></section>
+
+    
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/config-options/"><abbr title="https://developers.whmcs.com/provisioning-modules/config-options/">https://developers.whmcs.com/provisioning-modules/config-options/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_TestConnection">
+        seafile_TestConnection()
+        <a href="namespaces/default.html#function_seafile_TestConnection" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">70</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Test connection to a SeaFile server with the given server parameters.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_TestConnection</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">array&lt;string|int, mixed&gt;</span></code>
+
+        <section class="phpdocumentor-description"><p>Allows an admin user to verify that an API connection can be
+successfully made with the given configuration parameters for a
+server.</p>
+<p>When defined in a module, a Test Connection button will appear
+alongside the Server Type dropdown when adding or editing an
+existing server.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_UsageUpdate">
+        seafile_UsageUpdate()
+        <a href="namespaces/default.html#function_seafile_UsageUpdate" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">101</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Usage Update</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_UsageUpdate</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">mixed</span></code>
+
+        <section class="phpdocumentor-description"><p>Important: Runs daily per server not per product
+Run Manually: /admin/reports.php?report=disk_usage_summary&amp;action=updatestats</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/usage-update/"><abbr title="https://developers.whmcs.com/provisioning-modules/usage-update/">https://developers.whmcs.com/provisioning-modules/usage-update/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ClientArea">
+        seafile_ClientArea()
+        <a href="namespaces/default.html#function_seafile_ClientArea" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">176</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Client area output logic handling.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ClientArea</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">array&lt;string|int, mixed&gt;</span></code>
+
+        <section class="phpdocumentor-description"><p>This function is used to define module specific client area output. It should
+return an array consisting of a template file and optional additional
+template variables to make available to that template.</p>
+<p>The template file you return can be one of two types:</p>
+<ul>
+<li>
+<p>tabOverviewModuleOutputTemplate - The output of the template provided here
+will be displayed as part of the default product/service client area
+product overview page.</p>
+</li>
+<li>
+<p>tabOverviewReplacementTemplate - Alternatively using this option allows you
+to entirely take control of the product/service overview page within the
+client area.</p>
+</li>
+</ul>
+<p>Whichever option you choose, extra template variables are defined in the same
+way. This demonstrates the use of the full replacement.</p>
+<p>Please Note: Using tabOverviewReplacementTemplate means you should display
+the standard information such as pricing and billing details in your custom
+template or they will not be visible to the end user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ChangePassword">
+        seafile_ChangePassword()
+        <a href="namespaces/default.html#function_seafile_ChangePassword" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">239</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Change the password for a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ChangePassword</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when a password change is requested. This can occur either due to a
+client requesting it via the client area or an admin requesting it from the
+admin side.</p>
+<p>This option is only available to client end users when the product is in an
+active status.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ChangePackage">
+        seafile_ChangePackage()
+        <a href="namespaces/default.html#function_seafile_ChangePackage" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">298</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Set a new quota of a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ChangePackage</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called to apply a quota change of the service. It
+is called to provision upgrade or downgrade orders, as well as being
+able to be invoked manually by an admin user.</p>
+<p>This same function is called for upgrades and downgrades of both
+products and configurable options.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_CreateAccount">
+        seafile_CreateAccount()
+        <a href="namespaces/default.html#function_seafile_CreateAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">374</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Provision a new instance of a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_CreateAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Attempt to provision a new SeaFile account. This is
+called any time provisioning is requested inside of WHMCS. Depending upon the
+configuration, this can be any of:</p>
+<ul>
+<li>When a new order is placed</li>
+<li>When an invoice for a new order is paid</li>
+<li>Upon manual request by an admin user</li>
+</ul>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_SuspendAccount">
+        seafile_SuspendAccount()
+        <a href="namespaces/default.html#function_seafile_SuspendAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">464</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Set a SeaFile account to status inactive.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_SuspendAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when a suspension is requested. This is invoked automatically by WHMCS
+when a product becomes overdue on payment or can be called manually by admin
+user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_UnsuspendAccount">
+        seafile_UnsuspendAccount()
+        <a href="namespaces/default.html#function_seafile_UnsuspendAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">503</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Set a SeaFile account to status active.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_UnsuspendAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when an un-suspension is requested. This is invoked
+automatically upon payment of an overdue invoice for a product, or
+can be called manually by admin user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_TerminateAccount">
+        seafile_TerminateAccount()
+        <a href="namespaces/default.html#function_seafile_TerminateAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">542</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Removes a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_TerminateAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when a termination is requested. This can be invoked automatically for
+overdue products if enabled, or requested manually by an admin user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafileCheckPassword">
+        seafileCheckPassword()
+        <a href="namespaces/default.html#function_seafileCheckPassword" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">583</span>
+</aside>
+
+        <p class="phpdocumentor-summary">server side password check</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafileCheckPassword</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">string&nbsp;</span><span class="phpdocumentor-signature__argument__name">$pwd</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>recheck the client side password check
+in case that the client side check has been disabled</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$pwd</span>
+                : <span class="phpdocumentor-signature__argument__return-type">string</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>password</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+
+    
+</article>
+            </section>
+
+    </article>
+                <section data-search-results class="phpdocumentor-search-results phpdocumentor-search-results--hidden">
+    <section class="phpdocumentor-search-results__dialog">
+        <header class="phpdocumentor-search-results__header">
+            <h2 class="phpdocumentor-search-results__title">Search results</h2>
+            <button class="phpdocumentor-search-results__close"><i class="fas fa-times"></i></button>
+        </header>
+        <section class="phpdocumentor-search-results__body">
+            <ul class="phpdocumentor-search-results__entries"></ul>
+        </section>
+    </section>
+</section>
+            </div>
+        </div>
+        <a href="files/seafile.html#top" class="phpdocumentor-back-to-top"><i class="fas fa-chevron-circle-up"></i></a>
+
+    </main>
+
+    <script>
+        cssVars({});
+    </script>
+</body>
+</html>

+ 97 - 0
Doc/graphs/classes.html

@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title>Documentation</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <base href="../">
+    <link rel="icon" href="images/favicon.ico"/>
+    <link rel="stylesheet" href="css/normalize.css">
+    <link rel="stylesheet" href="css/base.css">
+            <script src='https://unpkg.com/panzoom@8.7.3/dist/panzoom.min.js'></script>
+</head>
+<body id="top">
+    <header class="phpdocumentor-header phpdocumentor-section">
+    <h1 class="phpdocumentor-title"><a href="" class="phpdocumentor-title__link">Documentation</a></h1>
+    <input class="phpdocumentor-header__menu-button" type="checkbox" id="menu-button" name="menu-button" />
+    <label class="phpdocumentor-header__menu-icon" for="menu-button">
+        <i class="fas fa-bars"></i>
+    </label>
+    <section data-search-form class="phpdocumentor-search">
+    <label>
+        <span class="visually-hidden">Search for</span>
+        <svg class="phpdocumentor-search__icon" width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+            <circle cx="7.5" cy="7.5" r="6.5" stroke="currentColor" stroke-width="2"/>
+            <line x1="12.4892" y1="12.2727" x2="19.1559" y2="18.9393" stroke="currentColor" stroke-width="3"/>
+        </svg>
+        <input type="search" class="phpdocumentor-field phpdocumentor-search__field" placeholder="Loading .." disabled />
+    </label>
+</section>
+
+    <nav class="phpdocumentor-topnav">
+    <ul class="phpdocumentor-topnav__menu">
+        </ul>
+</nav>
+</header>
+
+    <main class="phpdocumentor">
+        <div class="phpdocumentor-section">
+            <input class="phpdocumentor-sidebar__menu-button" type="checkbox" id="sidebar-button" name="sidebar-button" />
+<label class="phpdocumentor-sidebar__menu-icon" for="sidebar-button">
+    Menu
+</label>
+<aside class="phpdocumentor-column -four phpdocumentor-sidebar">
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Namespaces</h2>
+                                <h3 class="phpdocumentor-sidebar__root-namespace"><a href="namespaces/default.html"><abbr title="\">Global</abbr></a></h3>
+                                    </section>
+
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Reports</h2>
+                <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/deprecated.html">Deprecated</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/errors.html">Errors</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/markers.html">Markers</a></h3>
+    </section>
+
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Indices</h2>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="indices/files.html">Files</a></h3>
+    </section>
+</aside>
+
+            <div class="phpdocumentor-column -eight phpdocumentor-content">
+                    <div class="phpdocumentor-class-graph">
+        <img class="phpdocumentor-class-graph__graph" src="graphs/classes.svg" id="scene" />
+    </div>
+    <script type="text/javascript">
+        var element = document.querySelector('#scene');
+
+        // And pass it to panzoom
+        panzoom(element, {
+            smoothScroll: false
+        })
+    </script>
+                <section data-search-results class="phpdocumentor-search-results phpdocumentor-search-results--hidden">
+    <section class="phpdocumentor-search-results__dialog">
+        <header class="phpdocumentor-search-results__header">
+            <h2 class="phpdocumentor-search-results__title">Search results</h2>
+            <button class="phpdocumentor-search-results__close"><i class="fas fa-times"></i></button>
+        </header>
+        <section class="phpdocumentor-search-results__body">
+            <ul class="phpdocumentor-search-results__entries"></ul>
+        </section>
+    </section>
+</section>
+            </div>
+        </div>
+        <a href="graphs/classes.html#top" class="phpdocumentor-back-to-top"><i class="fas fa-chevron-circle-up"></i></a>
+
+    </main>
+
+    <script>
+        cssVars({});
+    </script>
+</body>
+</html>

+ 814 - 0
Doc/index.html

@@ -0,0 +1,814 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title>Documentation</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    
+    <link rel="icon" href="images/favicon.ico"/>
+    <link rel="stylesheet" href="css/normalize.css">
+    <link rel="stylesheet" href="css/base.css">
+            <link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap" rel="stylesheet">
+        <link rel="stylesheet" href="css/template.css">
+        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/css/all.min.css" integrity="sha256-ybRkN9dBjhcS2qrW1z+hfCxq+1aBdwyQM5wlQoQVt/0=" crossorigin="anonymous" />
+                <script src="https://cdn.jsdelivr.net/npm/fuse.js@3.4.6"></script>
+        <script src="https://cdn.jsdelivr.net/npm/css-vars-ponyfill@2"></script>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/js/all.min.js" integrity="sha256-0vuk8LXoyrmCjp1f0O300qo1M75ZQyhH9X3J6d+scmk=" crossorigin="anonymous"></script>
+        <script src="js/search.js"></script>
+        <script defer src="js/searchIndex.js"></script>
+    </head>
+<body id="top">
+    <header class="phpdocumentor-header phpdocumentor-section">
+    <h1 class="phpdocumentor-title"><a href="" class="phpdocumentor-title__link">Documentation</a></h1>
+    <input class="phpdocumentor-header__menu-button" type="checkbox" id="menu-button" name="menu-button" />
+    <label class="phpdocumentor-header__menu-icon" for="menu-button">
+        <i class="fas fa-bars"></i>
+    </label>
+    <section data-search-form class="phpdocumentor-search">
+    <label>
+        <span class="visually-hidden">Search for</span>
+        <svg class="phpdocumentor-search__icon" width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+            <circle cx="7.5" cy="7.5" r="6.5" stroke="currentColor" stroke-width="2"/>
+            <line x1="12.4892" y1="12.2727" x2="19.1559" y2="18.9393" stroke="currentColor" stroke-width="3"/>
+        </svg>
+        <input type="search" class="phpdocumentor-field phpdocumentor-search__field" placeholder="Loading .." disabled />
+    </label>
+</section>
+
+    <nav class="phpdocumentor-topnav">
+    <ul class="phpdocumentor-topnav__menu">
+        </ul>
+</nav>
+</header>
+
+    <main class="phpdocumentor">
+        <div class="phpdocumentor-section">
+            <input class="phpdocumentor-sidebar__menu-button" type="checkbox" id="sidebar-button" name="sidebar-button" />
+<label class="phpdocumentor-sidebar__menu-icon" for="sidebar-button">
+    Menu
+</label>
+<aside class="phpdocumentor-column -four phpdocumentor-sidebar">
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Namespaces</h2>
+                                <h3 class="phpdocumentor-sidebar__root-namespace"><a href="namespaces/default.html"><abbr title="\">Global</abbr></a></h3>
+                                    </section>
+
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Reports</h2>
+                <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/deprecated.html">Deprecated</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/errors.html">Errors</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/markers.html">Markers</a></h3>
+    </section>
+
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Indices</h2>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="indices/files.html">Files</a></h3>
+    </section>
+</aside>
+
+            <div class="phpdocumentor-column -eight phpdocumentor-content">
+                    <h2>Documentation</h2>
+
+    
+    
+
+
+
+<h3 id="toc">
+    Table of Contents
+    <a href="#toc" class="headerlink"><i class="fas fa-link"></i></a>
+</h3>
+
+<dl class="phpdocumentor-table-of-contents">
+                        <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_MetaData">seafile_MetaData()</a>
+    <span>
+                        &nbsp;: mixed    </span>
+</dt>
+<dd></dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ConfigOptions">seafile_ConfigOptions()</a>
+    <span>
+                        &nbsp;: array&lt;string|int, mixed&gt;    </span>
+</dt>
+<dd>Define SeaFile product configuration options.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_TestConnection">seafile_TestConnection()</a>
+    <span>
+                        &nbsp;: array&lt;string|int, mixed&gt;    </span>
+</dt>
+<dd>Test connection to a SeaFile server with the given server parameters.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_UsageUpdate">seafile_UsageUpdate()</a>
+    <span>
+                        &nbsp;: mixed    </span>
+</dt>
+<dd>Usage Update</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ClientArea">seafile_ClientArea()</a>
+    <span>
+                        &nbsp;: array&lt;string|int, mixed&gt;    </span>
+</dt>
+<dd>Client area output logic handling.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ChangePassword">seafile_ChangePassword()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Change the password for a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ChangePackage">seafile_ChangePackage()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Set a new quota of a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_CreateAccount">seafile_CreateAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Provision a new instance of a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_SuspendAccount">seafile_SuspendAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Set a SeaFile account to status inactive.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_UnsuspendAccount">seafile_UnsuspendAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Set a SeaFile account to status active.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_TerminateAccount">seafile_TerminateAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Removes a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafileCheckPassword">seafileCheckPassword()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>server side password check</dd>
+
+    </dl>
+
+    
+
+        <section class="phpdocumentor-functions">
+        <h3 class="phpdocumentor-elements__header" id="functions">
+            Functions
+            <a href="namespaces/default.html#functions" class="headerlink"><i class="fas fa-link"></i></a>
+        </h3>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_MetaData">
+        seafile_MetaData()
+        <a href="namespaces/default.html#function_seafile_MetaData" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">18</span>
+</aside>
+
+    
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_MetaData</span><span>(</span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">mixed</span></code>
+
+    
+    
+    
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ConfigOptions">
+        seafile_ConfigOptions()
+        <a href="namespaces/default.html#function_seafile_ConfigOptions" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">40</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Define SeaFile product configuration options.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ConfigOptions</span><span>(</span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">array&lt;string|int, mixed&gt;</span></code>
+
+        <section class="phpdocumentor-description"></section>
+
+    
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/config-options/"><abbr title="https://developers.whmcs.com/provisioning-modules/config-options/">https://developers.whmcs.com/provisioning-modules/config-options/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_TestConnection">
+        seafile_TestConnection()
+        <a href="namespaces/default.html#function_seafile_TestConnection" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">70</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Test connection to a SeaFile server with the given server parameters.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_TestConnection</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">array&lt;string|int, mixed&gt;</span></code>
+
+        <section class="phpdocumentor-description"><p>Allows an admin user to verify that an API connection can be
+successfully made with the given configuration parameters for a
+server.</p>
+<p>When defined in a module, a Test Connection button will appear
+alongside the Server Type dropdown when adding or editing an
+existing server.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_UsageUpdate">
+        seafile_UsageUpdate()
+        <a href="namespaces/default.html#function_seafile_UsageUpdate" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">101</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Usage Update</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_UsageUpdate</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">mixed</span></code>
+
+        <section class="phpdocumentor-description"><p>Important: Runs daily per server not per product
+Run Manually: /admin/reports.php?report=disk_usage_summary&amp;action=updatestats</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/usage-update/"><abbr title="https://developers.whmcs.com/provisioning-modules/usage-update/">https://developers.whmcs.com/provisioning-modules/usage-update/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ClientArea">
+        seafile_ClientArea()
+        <a href="namespaces/default.html#function_seafile_ClientArea" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">176</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Client area output logic handling.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ClientArea</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">array&lt;string|int, mixed&gt;</span></code>
+
+        <section class="phpdocumentor-description"><p>This function is used to define module specific client area output. It should
+return an array consisting of a template file and optional additional
+template variables to make available to that template.</p>
+<p>The template file you return can be one of two types:</p>
+<ul>
+<li>
+<p>tabOverviewModuleOutputTemplate - The output of the template provided here
+will be displayed as part of the default product/service client area
+product overview page.</p>
+</li>
+<li>
+<p>tabOverviewReplacementTemplate - Alternatively using this option allows you
+to entirely take control of the product/service overview page within the
+client area.</p>
+</li>
+</ul>
+<p>Whichever option you choose, extra template variables are defined in the same
+way. This demonstrates the use of the full replacement.</p>
+<p>Please Note: Using tabOverviewReplacementTemplate means you should display
+the standard information such as pricing and billing details in your custom
+template or they will not be visible to the end user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ChangePassword">
+        seafile_ChangePassword()
+        <a href="namespaces/default.html#function_seafile_ChangePassword" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">239</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Change the password for a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ChangePassword</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when a password change is requested. This can occur either due to a
+client requesting it via the client area or an admin requesting it from the
+admin side.</p>
+<p>This option is only available to client end users when the product is in an
+active status.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ChangePackage">
+        seafile_ChangePackage()
+        <a href="namespaces/default.html#function_seafile_ChangePackage" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">298</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Set a new quota of a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ChangePackage</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called to apply a quota change of the service. It
+is called to provision upgrade or downgrade orders, as well as being
+able to be invoked manually by an admin user.</p>
+<p>This same function is called for upgrades and downgrades of both
+products and configurable options.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_CreateAccount">
+        seafile_CreateAccount()
+        <a href="namespaces/default.html#function_seafile_CreateAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">374</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Provision a new instance of a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_CreateAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Attempt to provision a new SeaFile account. This is
+called any time provisioning is requested inside of WHMCS. Depending upon the
+configuration, this can be any of:</p>
+<ul>
+<li>When a new order is placed</li>
+<li>When an invoice for a new order is paid</li>
+<li>Upon manual request by an admin user</li>
+</ul>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_SuspendAccount">
+        seafile_SuspendAccount()
+        <a href="namespaces/default.html#function_seafile_SuspendAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">464</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Set a SeaFile account to status inactive.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_SuspendAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when a suspension is requested. This is invoked automatically by WHMCS
+when a product becomes overdue on payment or can be called manually by admin
+user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_UnsuspendAccount">
+        seafile_UnsuspendAccount()
+        <a href="namespaces/default.html#function_seafile_UnsuspendAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">503</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Set a SeaFile account to status active.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_UnsuspendAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when an un-suspension is requested. This is invoked
+automatically upon payment of an overdue invoice for a product, or
+can be called manually by admin user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_TerminateAccount">
+        seafile_TerminateAccount()
+        <a href="namespaces/default.html#function_seafile_TerminateAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">542</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Removes a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_TerminateAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when a termination is requested. This can be invoked automatically for
+overdue products if enabled, or requested manually by an admin user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafileCheckPassword">
+        seafileCheckPassword()
+        <a href="namespaces/default.html#function_seafileCheckPassword" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">583</span>
+</aside>
+
+        <p class="phpdocumentor-summary">server side password check</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafileCheckPassword</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">string&nbsp;</span><span class="phpdocumentor-signature__argument__name">$pwd</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>recheck the client side password check
+in case that the client side check has been disabled</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$pwd</span>
+                : <span class="phpdocumentor-signature__argument__return-type">string</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>password</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+
+    
+</article>
+            </section>
+
+                <section data-search-results class="phpdocumentor-search-results phpdocumentor-search-results--hidden">
+    <section class="phpdocumentor-search-results__dialog">
+        <header class="phpdocumentor-search-results__header">
+            <h2 class="phpdocumentor-search-results__title">Search results</h2>
+            <button class="phpdocumentor-search-results__close"><i class="fas fa-times"></i></button>
+        </header>
+        <section class="phpdocumentor-search-results__body">
+            <ul class="phpdocumentor-search-results__entries"></ul>
+        </section>
+    </section>
+</section>
+            </div>
+        </div>
+        <a href="index.html#top" class="phpdocumentor-back-to-top"><i class="fas fa-chevron-circle-up"></i></a>
+
+    </main>
+
+    <script>
+        cssVars({});
+    </script>
+</body>
+</html>

+ 99 - 0
Doc/indices/files.html

@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title>Documentation</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <base href="../">
+    <link rel="icon" href="images/favicon.ico"/>
+    <link rel="stylesheet" href="css/normalize.css">
+    <link rel="stylesheet" href="css/base.css">
+            <link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap" rel="stylesheet">
+        <link rel="stylesheet" href="css/template.css">
+        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/css/all.min.css" integrity="sha256-ybRkN9dBjhcS2qrW1z+hfCxq+1aBdwyQM5wlQoQVt/0=" crossorigin="anonymous" />
+                <script src="https://cdn.jsdelivr.net/npm/fuse.js@3.4.6"></script>
+        <script src="https://cdn.jsdelivr.net/npm/css-vars-ponyfill@2"></script>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/js/all.min.js" integrity="sha256-0vuk8LXoyrmCjp1f0O300qo1M75ZQyhH9X3J6d+scmk=" crossorigin="anonymous"></script>
+        <script src="js/search.js"></script>
+        <script defer src="js/searchIndex.js"></script>
+    </head>
+<body id="top">
+    <header class="phpdocumentor-header phpdocumentor-section">
+    <h1 class="phpdocumentor-title"><a href="" class="phpdocumentor-title__link">Documentation</a></h1>
+    <input class="phpdocumentor-header__menu-button" type="checkbox" id="menu-button" name="menu-button" />
+    <label class="phpdocumentor-header__menu-icon" for="menu-button">
+        <i class="fas fa-bars"></i>
+    </label>
+    <section data-search-form class="phpdocumentor-search">
+    <label>
+        <span class="visually-hidden">Search for</span>
+        <svg class="phpdocumentor-search__icon" width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+            <circle cx="7.5" cy="7.5" r="6.5" stroke="currentColor" stroke-width="2"/>
+            <line x1="12.4892" y1="12.2727" x2="19.1559" y2="18.9393" stroke="currentColor" stroke-width="3"/>
+        </svg>
+        <input type="search" class="phpdocumentor-field phpdocumentor-search__field" placeholder="Loading .." disabled />
+    </label>
+</section>
+
+    <nav class="phpdocumentor-topnav">
+    <ul class="phpdocumentor-topnav__menu">
+        </ul>
+</nav>
+</header>
+
+    <main class="phpdocumentor">
+        <div class="phpdocumentor-section">
+            <input class="phpdocumentor-sidebar__menu-button" type="checkbox" id="sidebar-button" name="sidebar-button" />
+<label class="phpdocumentor-sidebar__menu-icon" for="sidebar-button">
+    Menu
+</label>
+<aside class="phpdocumentor-column -four phpdocumentor-sidebar">
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Namespaces</h2>
+                                <h3 class="phpdocumentor-sidebar__root-namespace"><a href="namespaces/default.html"><abbr title="\">Global</abbr></a></h3>
+                                    </section>
+
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Reports</h2>
+                <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/deprecated.html">Deprecated</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/errors.html">Errors</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/markers.html">Markers</a></h3>
+    </section>
+
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Indices</h2>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="indices/files.html">Files</a></h3>
+    </section>
+</aside>
+
+            <div class="phpdocumentor-column -eight phpdocumentor-content">
+                    
+    <h2>Files</h2>
+                                                                                                                                                                                                                                                                                                                                                                                                    <h3>S</h3>
+        <ul class="phpdocumentor-list">
+                    <li><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></li>
+                </ul>
+                                                                                                                                                                        <section data-search-results class="phpdocumentor-search-results phpdocumentor-search-results--hidden">
+    <section class="phpdocumentor-search-results__dialog">
+        <header class="phpdocumentor-search-results__header">
+            <h2 class="phpdocumentor-search-results__title">Search results</h2>
+            <button class="phpdocumentor-search-results__close"><i class="fas fa-times"></i></button>
+        </header>
+        <section class="phpdocumentor-search-results__body">
+            <ul class="phpdocumentor-search-results__entries"></ul>
+        </section>
+    </section>
+</section>
+            </div>
+        </div>
+        <a href="indices/files.html#top" class="phpdocumentor-back-to-top"><i class="fas fa-chevron-circle-up"></i></a>
+
+    </main>
+
+    <script>
+        cssVars({});
+    </script>
+</body>
+</html>

+ 173 - 0
Doc/js/search.js

@@ -0,0 +1,173 @@
+// Search module for phpDocumentor
+//
+// This module is a wrapper around fuse.js that will use a given index and attach itself to a
+// search form and to a search results pane identified by the following data attributes:
+//
+// 1. data-search-form
+// 2. data-search-results
+//
+// The data-search-form is expected to have a single input element of type 'search' that will trigger searching for
+// a series of results, were the data-search-results pane is expected to have a direct UL child that will be populated
+// with rendered results.
+//
+// The search has various stages, upon loading this stage the data-search-form receives the CSS class
+// 'phpdocumentor-search--enabled'; this indicates that JS is allowed and indices are being loaded. It is recommended
+// to hide the form by default and show it when it receives this class to achieve progressive enhancement for this
+// feature.
+//
+// After loading this module, it is expected to load a search index asynchronously, for example:
+//
+//         <script defer src="js/searchIndex.js"></script>
+//
+// In this script the generated index should attach itself to the search module using the `appendIndex` function. By
+// doing it like this the page will continue loading, unhindered by the loading of the search.
+//
+// After the page has fully loaded, and all these deferred indexes loaded, the initialization of the search module will
+// be called and the form will receive the class 'phpdocumentor-search--active', indicating search is ready. At this
+// point, the input field will also have it's 'disabled' attribute removed.
+var Search = (function () {
+    var fuse;
+    var index = [];
+    var options = {
+        shouldSort: true,
+        threshold: 0.6,
+        location: 0,
+        distance: 100,
+        maxPatternLength: 32,
+        minMatchCharLength: 1,
+        keys: [
+            "fqsen",
+            "name",
+            "summary",
+            "url"
+        ]
+    };
+
+    // Credit David Walsh (https://davidwalsh.name/javascript-debounce-function)
+    // Returns a function, that, as long as it continues to be invoked, will not
+    // be triggered. The function will be called after it stops being called for
+    // N milliseconds. If `immediate` is passed, trigger the function on the
+    // leading edge, instead of the trailing.
+    function debounce(func, wait, immediate) {
+        var timeout;
+
+        return function executedFunction() {
+            var context = this;
+            var args = arguments;
+
+            var later = function () {
+                timeout = null;
+                if (!immediate) func.apply(context, args);
+            };
+
+            var callNow = immediate && !timeout;
+            clearTimeout(timeout);
+            timeout = setTimeout(later, wait);
+            if (callNow) func.apply(context, args);
+        };
+    }
+
+    function close() {
+        // Start scroll prevention: https://css-tricks.com/prevent-page-scrolling-when-a-modal-is-open/
+        const scrollY = document.body.style.top;
+        document.body.style.position = '';
+        document.body.style.top = '';
+        window.scrollTo(0, parseInt(scrollY || '0') * -1);
+        // End scroll prevention
+
+        var form = document.querySelector('[data-search-form]');
+        var searchResults = document.querySelector('[data-search-results]');
+
+        form.classList.toggle('phpdocumentor-search--has-results', false);
+        searchResults.classList.add('phpdocumentor-search-results--hidden');
+        var searchField = document.querySelector('[data-search-form] input[type="search"]');
+        searchField.blur();
+    }
+
+    function search(event) {
+        // Start scroll prevention: https://css-tricks.com/prevent-page-scrolling-when-a-modal-is-open/
+        document.body.style.position = 'fixed';
+        document.body.style.top = `-${window.scrollY}px`;
+        // End scroll prevention
+
+        // prevent enter's from autosubmitting
+        event.stopPropagation();
+
+        var form = document.querySelector('[data-search-form]');
+        var searchResults = document.querySelector('[data-search-results]');
+        var searchResultEntries = document.querySelector('[data-search-results] .phpdocumentor-search-results__entries');
+
+        searchResultEntries.innerHTML = '';
+
+        if (!event.target.value) {
+            close();
+            return;
+        }
+
+        form.classList.toggle('phpdocumentor-search--has-results', true);
+        searchResults.classList.remove('phpdocumentor-search-results--hidden');
+        var results = fuse.search(event.target.value, {limit: 25});
+
+        results.forEach(function (result) {
+            var entry = document.createElement("li");
+            entry.classList.add("phpdocumentor-search-results__entry");
+            entry.innerHTML += '<h3><a href="' + document.baseURI + result.url + '">' + result.name + "</h3>\n";
+            entry.innerHTML += '<small>' + result.fqsen + "</small>\n";
+            entry.innerHTML += '<div class="phpdocumentor-summary">' + result.summary + '</div>';
+            searchResultEntries.appendChild(entry)
+        });
+    }
+
+    function appendIndex(added) {
+        index = index.concat(added);
+
+        // re-initialize search engine when appending an index after initialisation
+        if (typeof fuse !== 'undefined') {
+            fuse = new Fuse(index, options);
+        }
+    }
+
+    function init() {
+        fuse = new Fuse(index, options);
+
+        var form = document.querySelector('[data-search-form]');
+        var searchField = document.querySelector('[data-search-form] input[type="search"]');
+
+        var closeButton = document.querySelector('.phpdocumentor-search-results__close');
+        closeButton.addEventListener('click', function() { close() }.bind(this));
+
+        var searchResults = document.querySelector('[data-search-results]');
+        searchResults.addEventListener('click', function() { close() }.bind(this));
+
+        form.classList.add('phpdocumentor-search--active');
+
+        searchField.setAttribute('placeholder', 'Search (Press "/" to focus)');
+        searchField.removeAttribute('disabled');
+        searchField.addEventListener('keyup', debounce(search, 300));
+
+        window.addEventListener('keyup', function (event) {
+            if (event.key === '/') {
+                searchField.focus();
+            }
+            if (event.code === 'Escape') {
+                close();
+            }
+        }.bind(this));
+    }
+
+    return {
+        appendIndex,
+        init
+    }
+})();
+
+window.addEventListener('DOMContentLoaded', function () {
+    var form = document.querySelector('[data-search-form]');
+
+    // When JS is supported; show search box. Must be before including the search for it to take effect immediately
+    form.classList.add('phpdocumentor-search--enabled');
+});
+
+window.addEventListener('load', function () {
+    Search.init();
+});

+ 69 - 0
Doc/js/searchIndex.js

@@ -0,0 +1,69 @@
+Search.appendIndex(
+    [
+                {
+            "fqsen": "\\seafile_MetaData\u0028\u0029",
+            "name": "seafile_MetaData",
+            "summary": "",
+            "url": "namespaces/default.html#function_seafile_MetaData"
+        },                {
+            "fqsen": "\\seafile_ConfigOptions\u0028\u0029",
+            "name": "seafile_ConfigOptions",
+            "summary": "Define\u0020SeaFile\u0020product\u0020configuration\u0020options.",
+            "url": "namespaces/default.html#function_seafile_ConfigOptions"
+        },                {
+            "fqsen": "\\seafile_TestConnection\u0028\u0029",
+            "name": "seafile_TestConnection",
+            "summary": "Test\u0020connection\u0020to\u0020a\u0020SeaFile\u0020server\u0020with\u0020the\u0020given\u0020server\u0020parameters.",
+            "url": "namespaces/default.html#function_seafile_TestConnection"
+        },                {
+            "fqsen": "\\seafile_UsageUpdate\u0028\u0029",
+            "name": "seafile_UsageUpdate",
+            "summary": "Usage\u0020Update",
+            "url": "namespaces/default.html#function_seafile_UsageUpdate"
+        },                {
+            "fqsen": "\\seafile_ClientArea\u0028\u0029",
+            "name": "seafile_ClientArea",
+            "summary": "Client\u0020area\u0020output\u0020logic\u0020handling.",
+            "url": "namespaces/default.html#function_seafile_ClientArea"
+        },                {
+            "fqsen": "\\seafile_ChangePassword\u0028\u0029",
+            "name": "seafile_ChangePassword",
+            "summary": "Change\u0020the\u0020password\u0020for\u0020a\u0020SeaFile\u0020account.",
+            "url": "namespaces/default.html#function_seafile_ChangePassword"
+        },                {
+            "fqsen": "\\seafile_ChangePackage\u0028\u0029",
+            "name": "seafile_ChangePackage",
+            "summary": "Set\u0020a\u0020new\u0020quota\u0020of\u0020a\u0020SeaFile\u0020account.",
+            "url": "namespaces/default.html#function_seafile_ChangePackage"
+        },                {
+            "fqsen": "\\seafile_CreateAccount\u0028\u0029",
+            "name": "seafile_CreateAccount",
+            "summary": "Provision\u0020a\u0020new\u0020instance\u0020of\u0020a\u0020SeaFile\u0020account.",
+            "url": "namespaces/default.html#function_seafile_CreateAccount"
+        },                {
+            "fqsen": "\\seafile_SuspendAccount\u0028\u0029",
+            "name": "seafile_SuspendAccount",
+            "summary": "Set\u0020a\u0020SeaFile\u0020account\u0020to\u0020status\u0020inactive.",
+            "url": "namespaces/default.html#function_seafile_SuspendAccount"
+        },                {
+            "fqsen": "\\seafile_UnsuspendAccount\u0028\u0029",
+            "name": "seafile_UnsuspendAccount",
+            "summary": "Set\u0020a\u0020SeaFile\u0020account\u0020to\u0020status\u0020active.",
+            "url": "namespaces/default.html#function_seafile_UnsuspendAccount"
+        },                {
+            "fqsen": "\\seafile_TerminateAccount\u0028\u0029",
+            "name": "seafile_TerminateAccount",
+            "summary": "Removes\u0020a\u0020SeaFile\u0020account.",
+            "url": "namespaces/default.html#function_seafile_TerminateAccount"
+        },                {
+            "fqsen": "\\seafileCheckPassword\u0028\u0029",
+            "name": "seafileCheckPassword",
+            "summary": "server\u0020side\u0020password\u0020check",
+            "url": "namespaces/default.html#function_seafileCheckPassword"
+        },                {
+            "fqsen": "\\",
+            "name": "\\",
+            "summary": "",
+            "url": "namespaces/default.html"
+        }            ]
+);

+ 818 - 0
Doc/namespaces/default.html

@@ -0,0 +1,818 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title>Documentation</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <base href="../">
+    <link rel="icon" href="images/favicon.ico"/>
+    <link rel="stylesheet" href="css/normalize.css">
+    <link rel="stylesheet" href="css/base.css">
+            <link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap" rel="stylesheet">
+        <link rel="stylesheet" href="css/template.css">
+        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/css/all.min.css" integrity="sha256-ybRkN9dBjhcS2qrW1z+hfCxq+1aBdwyQM5wlQoQVt/0=" crossorigin="anonymous" />
+                <script src="https://cdn.jsdelivr.net/npm/fuse.js@3.4.6"></script>
+        <script src="https://cdn.jsdelivr.net/npm/css-vars-ponyfill@2"></script>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/js/all.min.js" integrity="sha256-0vuk8LXoyrmCjp1f0O300qo1M75ZQyhH9X3J6d+scmk=" crossorigin="anonymous"></script>
+        <script src="js/search.js"></script>
+        <script defer src="js/searchIndex.js"></script>
+    </head>
+<body id="top">
+    <header class="phpdocumentor-header phpdocumentor-section">
+    <h1 class="phpdocumentor-title"><a href="" class="phpdocumentor-title__link">Documentation</a></h1>
+    <input class="phpdocumentor-header__menu-button" type="checkbox" id="menu-button" name="menu-button" />
+    <label class="phpdocumentor-header__menu-icon" for="menu-button">
+        <i class="fas fa-bars"></i>
+    </label>
+    <section data-search-form class="phpdocumentor-search">
+    <label>
+        <span class="visually-hidden">Search for</span>
+        <svg class="phpdocumentor-search__icon" width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+            <circle cx="7.5" cy="7.5" r="6.5" stroke="currentColor" stroke-width="2"/>
+            <line x1="12.4892" y1="12.2727" x2="19.1559" y2="18.9393" stroke="currentColor" stroke-width="3"/>
+        </svg>
+        <input type="search" class="phpdocumentor-field phpdocumentor-search__field" placeholder="Loading .." disabled />
+    </label>
+</section>
+
+    <nav class="phpdocumentor-topnav">
+    <ul class="phpdocumentor-topnav__menu">
+        </ul>
+</nav>
+</header>
+
+    <main class="phpdocumentor">
+        <div class="phpdocumentor-section">
+            <input class="phpdocumentor-sidebar__menu-button" type="checkbox" id="sidebar-button" name="sidebar-button" />
+<label class="phpdocumentor-sidebar__menu-icon" for="sidebar-button">
+    Menu
+</label>
+<aside class="phpdocumentor-column -four phpdocumentor-sidebar">
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Namespaces</h2>
+                                <h3 class="phpdocumentor-sidebar__root-namespace"><a href="namespaces/default.html"><abbr title="\">Global</abbr></a></h3>
+                                    </section>
+
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Reports</h2>
+                <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/deprecated.html">Deprecated</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/errors.html">Errors</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/markers.html">Markers</a></h3>
+    </section>
+
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Indices</h2>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="indices/files.html">Files</a></h3>
+    </section>
+</aside>
+
+            <div class="phpdocumentor-column -eight phpdocumentor-content">
+                    <ul class="phpdocumentor-breadcrumbs">
+    </ul>
+
+    <article class="phpdocumentor-element -namespace">
+        <h2 class="phpdocumentor-content__title">API Documentation</h2>
+
+        
+
+
+
+<h3 id="toc">
+    Table of Contents
+    <a href="#toc" class="headerlink"><i class="fas fa-link"></i></a>
+</h3>
+
+<dl class="phpdocumentor-table-of-contents">
+                        <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_MetaData">seafile_MetaData()</a>
+    <span>
+                        &nbsp;: mixed    </span>
+</dt>
+<dd></dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ConfigOptions">seafile_ConfigOptions()</a>
+    <span>
+                        &nbsp;: array&lt;string|int, mixed&gt;    </span>
+</dt>
+<dd>Define SeaFile product configuration options.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_TestConnection">seafile_TestConnection()</a>
+    <span>
+                        &nbsp;: array&lt;string|int, mixed&gt;    </span>
+</dt>
+<dd>Test connection to a SeaFile server with the given server parameters.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_UsageUpdate">seafile_UsageUpdate()</a>
+    <span>
+                        &nbsp;: mixed    </span>
+</dt>
+<dd>Usage Update</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ClientArea">seafile_ClientArea()</a>
+    <span>
+                        &nbsp;: array&lt;string|int, mixed&gt;    </span>
+</dt>
+<dd>Client area output logic handling.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ChangePassword">seafile_ChangePassword()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Change the password for a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ChangePackage">seafile_ChangePackage()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Set a new quota of a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_CreateAccount">seafile_CreateAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Provision a new instance of a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_SuspendAccount">seafile_SuspendAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Set a SeaFile account to status inactive.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_UnsuspendAccount">seafile_UnsuspendAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Set a SeaFile account to status active.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_TerminateAccount">seafile_TerminateAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Removes a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafileCheckPassword">seafileCheckPassword()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>server side password check</dd>
+
+    </dl>
+
+        
+
+            <section class="phpdocumentor-functions">
+        <h3 class="phpdocumentor-elements__header" id="functions">
+            Functions
+            <a href="namespaces/default.html#functions" class="headerlink"><i class="fas fa-link"></i></a>
+        </h3>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_MetaData">
+        seafile_MetaData()
+        <a href="namespaces/default.html#function_seafile_MetaData" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">18</span>
+</aside>
+
+    
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_MetaData</span><span>(</span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">mixed</span></code>
+
+    
+    
+    
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ConfigOptions">
+        seafile_ConfigOptions()
+        <a href="namespaces/default.html#function_seafile_ConfigOptions" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">40</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Define SeaFile product configuration options.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ConfigOptions</span><span>(</span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">array&lt;string|int, mixed&gt;</span></code>
+
+        <section class="phpdocumentor-description"></section>
+
+    
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/config-options/"><abbr title="https://developers.whmcs.com/provisioning-modules/config-options/">https://developers.whmcs.com/provisioning-modules/config-options/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_TestConnection">
+        seafile_TestConnection()
+        <a href="namespaces/default.html#function_seafile_TestConnection" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">70</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Test connection to a SeaFile server with the given server parameters.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_TestConnection</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">array&lt;string|int, mixed&gt;</span></code>
+
+        <section class="phpdocumentor-description"><p>Allows an admin user to verify that an API connection can be
+successfully made with the given configuration parameters for a
+server.</p>
+<p>When defined in a module, a Test Connection button will appear
+alongside the Server Type dropdown when adding or editing an
+existing server.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_UsageUpdate">
+        seafile_UsageUpdate()
+        <a href="namespaces/default.html#function_seafile_UsageUpdate" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">101</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Usage Update</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_UsageUpdate</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">mixed</span></code>
+
+        <section class="phpdocumentor-description"><p>Important: Runs daily per server not per product
+Run Manually: /admin/reports.php?report=disk_usage_summary&amp;action=updatestats</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/usage-update/"><abbr title="https://developers.whmcs.com/provisioning-modules/usage-update/">https://developers.whmcs.com/provisioning-modules/usage-update/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ClientArea">
+        seafile_ClientArea()
+        <a href="namespaces/default.html#function_seafile_ClientArea" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">176</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Client area output logic handling.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ClientArea</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">array&lt;string|int, mixed&gt;</span></code>
+
+        <section class="phpdocumentor-description"><p>This function is used to define module specific client area output. It should
+return an array consisting of a template file and optional additional
+template variables to make available to that template.</p>
+<p>The template file you return can be one of two types:</p>
+<ul>
+<li>
+<p>tabOverviewModuleOutputTemplate - The output of the template provided here
+will be displayed as part of the default product/service client area
+product overview page.</p>
+</li>
+<li>
+<p>tabOverviewReplacementTemplate - Alternatively using this option allows you
+to entirely take control of the product/service overview page within the
+client area.</p>
+</li>
+</ul>
+<p>Whichever option you choose, extra template variables are defined in the same
+way. This demonstrates the use of the full replacement.</p>
+<p>Please Note: Using tabOverviewReplacementTemplate means you should display
+the standard information such as pricing and billing details in your custom
+template or they will not be visible to the end user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ChangePassword">
+        seafile_ChangePassword()
+        <a href="namespaces/default.html#function_seafile_ChangePassword" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">239</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Change the password for a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ChangePassword</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when a password change is requested. This can occur either due to a
+client requesting it via the client area or an admin requesting it from the
+admin side.</p>
+<p>This option is only available to client end users when the product is in an
+active status.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ChangePackage">
+        seafile_ChangePackage()
+        <a href="namespaces/default.html#function_seafile_ChangePackage" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">298</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Set a new quota of a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ChangePackage</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called to apply a quota change of the service. It
+is called to provision upgrade or downgrade orders, as well as being
+able to be invoked manually by an admin user.</p>
+<p>This same function is called for upgrades and downgrades of both
+products and configurable options.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_CreateAccount">
+        seafile_CreateAccount()
+        <a href="namespaces/default.html#function_seafile_CreateAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">374</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Provision a new instance of a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_CreateAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Attempt to provision a new SeaFile account. This is
+called any time provisioning is requested inside of WHMCS. Depending upon the
+configuration, this can be any of:</p>
+<ul>
+<li>When a new order is placed</li>
+<li>When an invoice for a new order is paid</li>
+<li>Upon manual request by an admin user</li>
+</ul>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_SuspendAccount">
+        seafile_SuspendAccount()
+        <a href="namespaces/default.html#function_seafile_SuspendAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">464</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Set a SeaFile account to status inactive.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_SuspendAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when a suspension is requested. This is invoked automatically by WHMCS
+when a product becomes overdue on payment or can be called manually by admin
+user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_UnsuspendAccount">
+        seafile_UnsuspendAccount()
+        <a href="namespaces/default.html#function_seafile_UnsuspendAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">503</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Set a SeaFile account to status active.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_UnsuspendAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when an un-suspension is requested. This is invoked
+automatically upon payment of an overdue invoice for a product, or
+can be called manually by admin user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_TerminateAccount">
+        seafile_TerminateAccount()
+        <a href="namespaces/default.html#function_seafile_TerminateAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">542</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Removes a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_TerminateAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when a termination is requested. This can be invoked automatically for
+overdue products if enabled, or requested manually by an admin user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafileCheckPassword">
+        seafileCheckPassword()
+        <a href="namespaces/default.html#function_seafileCheckPassword" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">583</span>
+</aside>
+
+        <p class="phpdocumentor-summary">server side password check</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafileCheckPassword</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">string&nbsp;</span><span class="phpdocumentor-signature__argument__name">$pwd</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>recheck the client side password check
+in case that the client side check has been disabled</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$pwd</span>
+                : <span class="phpdocumentor-signature__argument__return-type">string</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>password</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+
+    
+</article>
+            </section>
+
+    </article>
+                <section data-search-results class="phpdocumentor-search-results phpdocumentor-search-results--hidden">
+    <section class="phpdocumentor-search-results__dialog">
+        <header class="phpdocumentor-search-results__header">
+            <h2 class="phpdocumentor-search-results__title">Search results</h2>
+            <button class="phpdocumentor-search-results__close"><i class="fas fa-times"></i></button>
+        </header>
+        <section class="phpdocumentor-search-results__body">
+            <ul class="phpdocumentor-search-results__entries"></ul>
+        </section>
+    </section>
+</section>
+            </div>
+        </div>
+        <a href="namespaces/default.html#top" class="phpdocumentor-back-to-top"><i class="fas fa-chevron-circle-up"></i></a>
+
+    </main>
+
+    <script>
+        cssVars({});
+    </script>
+</body>
+</html>

+ 818 - 0
Doc/packages/Default.html

@@ -0,0 +1,818 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title>Documentation</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <base href="../">
+    <link rel="icon" href="images/favicon.ico"/>
+    <link rel="stylesheet" href="css/normalize.css">
+    <link rel="stylesheet" href="css/base.css">
+            <link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap" rel="stylesheet">
+        <link rel="stylesheet" href="css/template.css">
+        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/css/all.min.css" integrity="sha256-ybRkN9dBjhcS2qrW1z+hfCxq+1aBdwyQM5wlQoQVt/0=" crossorigin="anonymous" />
+                <script src="https://cdn.jsdelivr.net/npm/fuse.js@3.4.6"></script>
+        <script src="https://cdn.jsdelivr.net/npm/css-vars-ponyfill@2"></script>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/js/all.min.js" integrity="sha256-0vuk8LXoyrmCjp1f0O300qo1M75ZQyhH9X3J6d+scmk=" crossorigin="anonymous"></script>
+        <script src="js/search.js"></script>
+        <script defer src="js/searchIndex.js"></script>
+    </head>
+<body id="top">
+    <header class="phpdocumentor-header phpdocumentor-section">
+    <h1 class="phpdocumentor-title"><a href="" class="phpdocumentor-title__link">Documentation</a></h1>
+    <input class="phpdocumentor-header__menu-button" type="checkbox" id="menu-button" name="menu-button" />
+    <label class="phpdocumentor-header__menu-icon" for="menu-button">
+        <i class="fas fa-bars"></i>
+    </label>
+    <section data-search-form class="phpdocumentor-search">
+    <label>
+        <span class="visually-hidden">Search for</span>
+        <svg class="phpdocumentor-search__icon" width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+            <circle cx="7.5" cy="7.5" r="6.5" stroke="currentColor" stroke-width="2"/>
+            <line x1="12.4892" y1="12.2727" x2="19.1559" y2="18.9393" stroke="currentColor" stroke-width="3"/>
+        </svg>
+        <input type="search" class="phpdocumentor-field phpdocumentor-search__field" placeholder="Loading .." disabled />
+    </label>
+</section>
+
+    <nav class="phpdocumentor-topnav">
+    <ul class="phpdocumentor-topnav__menu">
+        </ul>
+</nav>
+</header>
+
+    <main class="phpdocumentor">
+        <div class="phpdocumentor-section">
+            <input class="phpdocumentor-sidebar__menu-button" type="checkbox" id="sidebar-button" name="sidebar-button" />
+<label class="phpdocumentor-sidebar__menu-icon" for="sidebar-button">
+    Menu
+</label>
+<aside class="phpdocumentor-column -four phpdocumentor-sidebar">
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Namespaces</h2>
+                                <h3 class="phpdocumentor-sidebar__root-namespace"><a href="namespaces/default.html"><abbr title="\">Global</abbr></a></h3>
+                                    </section>
+
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Reports</h2>
+                <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/deprecated.html">Deprecated</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/errors.html">Errors</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/markers.html">Markers</a></h3>
+    </section>
+
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Indices</h2>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="indices/files.html">Files</a></h3>
+    </section>
+</aside>
+
+            <div class="phpdocumentor-column -eight phpdocumentor-content">
+                    <ul class="phpdocumentor-breadcrumbs">
+    </ul>
+
+    <article class="phpdocumentor-element -package">
+        <h2 class="phpdocumentor-content__title">Default</h2>
+
+        
+
+
+
+<h3 id="toc">
+    Table of Contents
+    <a href="#toc" class="headerlink"><i class="fas fa-link"></i></a>
+</h3>
+
+<dl class="phpdocumentor-table-of-contents">
+                        <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_MetaData">seafile_MetaData()</a>
+    <span>
+                        &nbsp;: mixed    </span>
+</dt>
+<dd></dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ConfigOptions">seafile_ConfigOptions()</a>
+    <span>
+                        &nbsp;: array&lt;string|int, mixed&gt;    </span>
+</dt>
+<dd>Define SeaFile product configuration options.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_TestConnection">seafile_TestConnection()</a>
+    <span>
+                        &nbsp;: array&lt;string|int, mixed&gt;    </span>
+</dt>
+<dd>Test connection to a SeaFile server with the given server parameters.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_UsageUpdate">seafile_UsageUpdate()</a>
+    <span>
+                        &nbsp;: mixed    </span>
+</dt>
+<dd>Usage Update</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ClientArea">seafile_ClientArea()</a>
+    <span>
+                        &nbsp;: array&lt;string|int, mixed&gt;    </span>
+</dt>
+<dd>Client area output logic handling.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ChangePassword">seafile_ChangePassword()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Change the password for a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_ChangePackage">seafile_ChangePackage()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Set a new quota of a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_CreateAccount">seafile_CreateAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Provision a new instance of a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_SuspendAccount">seafile_SuspendAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Set a SeaFile account to status inactive.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_UnsuspendAccount">seafile_UnsuspendAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Set a SeaFile account to status active.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafile_TerminateAccount">seafile_TerminateAccount()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>Removes a SeaFile account.</dd>
+
+            <dt class="phpdocumentor-table-of-contents__entry -function -">
+    <a href="namespaces/default.html#function_seafileCheckPassword">seafileCheckPassword()</a>
+    <span>
+                        &nbsp;: string    </span>
+</dt>
+<dd>server side password check</dd>
+
+    </dl>
+
+        
+
+            <section class="phpdocumentor-functions">
+        <h3 class="phpdocumentor-elements__header" id="functions">
+            Functions
+            <a href="packages/Default.html#functions" class="headerlink"><i class="fas fa-link"></i></a>
+        </h3>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_MetaData">
+        seafile_MetaData()
+        <a href="namespaces/default.html#function_seafile_MetaData" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">18</span>
+</aside>
+
+    
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_MetaData</span><span>(</span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">mixed</span></code>
+
+    
+    
+    
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ConfigOptions">
+        seafile_ConfigOptions()
+        <a href="namespaces/default.html#function_seafile_ConfigOptions" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">40</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Define SeaFile product configuration options.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ConfigOptions</span><span>(</span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">array&lt;string|int, mixed&gt;</span></code>
+
+        <section class="phpdocumentor-description"></section>
+
+    
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/config-options/"><abbr title="https://developers.whmcs.com/provisioning-modules/config-options/">https://developers.whmcs.com/provisioning-modules/config-options/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_TestConnection">
+        seafile_TestConnection()
+        <a href="namespaces/default.html#function_seafile_TestConnection" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">70</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Test connection to a SeaFile server with the given server parameters.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_TestConnection</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">array&lt;string|int, mixed&gt;</span></code>
+
+        <section class="phpdocumentor-description"><p>Allows an admin user to verify that an API connection can be
+successfully made with the given configuration parameters for a
+server.</p>
+<p>When defined in a module, a Test Connection button will appear
+alongside the Server Type dropdown when adding or editing an
+existing server.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_UsageUpdate">
+        seafile_UsageUpdate()
+        <a href="namespaces/default.html#function_seafile_UsageUpdate" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">101</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Usage Update</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_UsageUpdate</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">mixed</span></code>
+
+        <section class="phpdocumentor-description"><p>Important: Runs daily per server not per product
+Run Manually: /admin/reports.php?report=disk_usage_summary&amp;action=updatestats</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/usage-update/"><abbr title="https://developers.whmcs.com/provisioning-modules/usage-update/">https://developers.whmcs.com/provisioning-modules/usage-update/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ClientArea">
+        seafile_ClientArea()
+        <a href="namespaces/default.html#function_seafile_ClientArea" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">176</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Client area output logic handling.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ClientArea</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">array&lt;string|int, mixed&gt;</span></code>
+
+        <section class="phpdocumentor-description"><p>This function is used to define module specific client area output. It should
+return an array consisting of a template file and optional additional
+template variables to make available to that template.</p>
+<p>The template file you return can be one of two types:</p>
+<ul>
+<li>
+<p>tabOverviewModuleOutputTemplate - The output of the template provided here
+will be displayed as part of the default product/service client area
+product overview page.</p>
+</li>
+<li>
+<p>tabOverviewReplacementTemplate - Alternatively using this option allows you
+to entirely take control of the product/service overview page within the
+client area.</p>
+</li>
+</ul>
+<p>Whichever option you choose, extra template variables are defined in the same
+way. This demonstrates the use of the full replacement.</p>
+<p>Please Note: Using tabOverviewReplacementTemplate means you should display
+the standard information such as pricing and billing details in your custom
+template or they will not be visible to the end user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ChangePassword">
+        seafile_ChangePassword()
+        <a href="namespaces/default.html#function_seafile_ChangePassword" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">239</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Change the password for a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ChangePassword</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when a password change is requested. This can occur either due to a
+client requesting it via the client area or an admin requesting it from the
+admin side.</p>
+<p>This option is only available to client end users when the product is in an
+active status.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_ChangePackage">
+        seafile_ChangePackage()
+        <a href="namespaces/default.html#function_seafile_ChangePackage" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">298</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Set a new quota of a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_ChangePackage</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called to apply a quota change of the service. It
+is called to provision upgrade or downgrade orders, as well as being
+able to be invoked manually by an admin user.</p>
+<p>This same function is called for upgrades and downgrades of both
+products and configurable options.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_CreateAccount">
+        seafile_CreateAccount()
+        <a href="namespaces/default.html#function_seafile_CreateAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">374</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Provision a new instance of a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_CreateAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Attempt to provision a new SeaFile account. This is
+called any time provisioning is requested inside of WHMCS. Depending upon the
+configuration, this can be any of:</p>
+<ul>
+<li>When a new order is placed</li>
+<li>When an invoice for a new order is paid</li>
+<li>Upon manual request by an admin user</li>
+</ul>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_SuspendAccount">
+        seafile_SuspendAccount()
+        <a href="namespaces/default.html#function_seafile_SuspendAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">464</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Set a SeaFile account to status inactive.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_SuspendAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when a suspension is requested. This is invoked automatically by WHMCS
+when a product becomes overdue on payment or can be called manually by admin
+user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_UnsuspendAccount">
+        seafile_UnsuspendAccount()
+        <a href="namespaces/default.html#function_seafile_UnsuspendAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">503</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Set a SeaFile account to status active.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_UnsuspendAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when an un-suspension is requested. This is invoked
+automatically upon payment of an overdue invoice for a product, or
+can be called manually by admin user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafile_TerminateAccount">
+        seafile_TerminateAccount()
+        <a href="namespaces/default.html#function_seafile_TerminateAccount" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">542</span>
+</aside>
+
+        <p class="phpdocumentor-summary">Removes a SeaFile account.</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafile_TerminateAccount</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;&nbsp;</span><span class="phpdocumentor-signature__argument__name">$params</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>Called when a termination is requested. This can be invoked automatically for
+overdue products if enabled, or requested manually by an admin user.</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$params</span>
+                : <span class="phpdocumentor-signature__argument__return-type">array&lt;string|int, mixed&gt;</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>common module parameters</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+    <h5 class="phpdocumentor-tag-list__heading" id="tags">
+        Tags
+        <a href="#tags" class="headerlink"><i class="fas fa-link"></i></a>
+    </h5>
+    <dl class="phpdocumentor-tag-list">
+                                    <dt class="phpdocumentor-tag-list__entry">
+                    <span class="phpdocumentor-tag__name">see</span>
+                </dt>
+                <dd class="phpdocumentor-tag-list__definition">
+                                                                                    <span class="phpdocumentor-tag-link"><a href="https://developers.whmcs.com/provisioning-modules/module-parameters/"><abbr title="https://developers.whmcs.com/provisioning-modules/module-parameters/">https://developers.whmcs.com/provisioning-modules/module-parameters/</abbr></a></span>
+                                        
+                                                 <section class="phpdocumentor-description"></section>
+
+                                    </dd>
+                        </dl>
+
+    
+</article>
+                    <article class="phpdocumentor-element -function - ">
+    <h4 class="phpdocumentor-element__name" id="function_seafileCheckPassword">
+        seafileCheckPassword()
+        <a href="namespaces/default.html#function_seafileCheckPassword" class="headerlink"><i class="fas fa-link"></i></a>
+    </h4>
+    <aside class="phpdocumentor-element-found-in">
+    <abbr class="phpdocumentor-element-found-in__file" title="seafile.php"><a href="files/seafile.html"><abbr title="seafile.php">seafile.php</abbr></a></abbr>
+    :
+    <span class="phpdocumentor-element-found-in__line">583</span>
+</aside>
+
+        <p class="phpdocumentor-summary">server side password check</p>
+
+    <code class="phpdocumentor-code phpdocumentor-signature ">
+    <span class="phpdocumentor-signature__visibility"></span>
+                <span class="phpdocumentor-signature__name">seafileCheckPassword</span><span>(</span><span class="phpdocumentor-signature__argument"><span class="phpdocumentor-signature__argument__return-type">string&nbsp;</span><span class="phpdocumentor-signature__argument__name">$pwd</span></span><span>)</span><span> : </span><span class="phpdocumentor-signature__response_type">string</span></code>
+
+        <section class="phpdocumentor-description"><p>recheck the client side password check
+in case that the client side check has been disabled</p>
+</section>
+
+        <h5 class="phpdocumentor-argument-list__heading">Parameters</h5>
+    <dl class="phpdocumentor-argument-list">
+                    <dt class="phpdocumentor-argument-list__entry">
+                <span class="phpdocumentor-signature__argument__name">$pwd</span>
+                : <span class="phpdocumentor-signature__argument__return-type">string</span>
+                            </dt>
+            <dd class="phpdocumentor-argument-list__definition">
+                    <section class="phpdocumentor-description"><p>password</p>
+</section>
+
+            </dd>
+            </dl>
+
+    
+
+    
+</article>
+            </section>
+
+    </article>
+                <section data-search-results class="phpdocumentor-search-results phpdocumentor-search-results--hidden">
+    <section class="phpdocumentor-search-results__dialog">
+        <header class="phpdocumentor-search-results__header">
+            <h2 class="phpdocumentor-search-results__title">Search results</h2>
+            <button class="phpdocumentor-search-results__close"><i class="fas fa-times"></i></button>
+        </header>
+        <section class="phpdocumentor-search-results__body">
+            <ul class="phpdocumentor-search-results__entries"></ul>
+        </section>
+    </section>
+</section>
+            </div>
+        </div>
+        <a href="packages/Default.html#top" class="phpdocumentor-back-to-top"><i class="fas fa-chevron-circle-up"></i></a>
+
+    </main>
+
+    <script>
+        cssVars({});
+    </script>
+</body>
+</html>

+ 116 - 0
Doc/packages/default.html

@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title>Documentation</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <base href="../">
+    <link rel="icon" href="images/favicon.ico"/>
+    <link rel="stylesheet" href="css/normalize.css">
+    <link rel="stylesheet" href="css/base.css">
+            <link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap" rel="stylesheet">
+        <link rel="stylesheet" href="css/template.css">
+        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/css/all.min.css" integrity="sha256-ybRkN9dBjhcS2qrW1z+hfCxq+1aBdwyQM5wlQoQVt/0=" crossorigin="anonymous" />
+                <script src="https://cdn.jsdelivr.net/npm/fuse.js@3.4.6"></script>
+        <script src="https://cdn.jsdelivr.net/npm/css-vars-ponyfill@2"></script>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/js/all.min.js" integrity="sha256-0vuk8LXoyrmCjp1f0O300qo1M75ZQyhH9X3J6d+scmk=" crossorigin="anonymous"></script>
+        <script src="js/search.js"></script>
+        <script defer src="js/searchIndex.js"></script>
+    </head>
+<body id="top">
+    <header class="phpdocumentor-header phpdocumentor-section">
+    <h1 class="phpdocumentor-title"><a href="" class="phpdocumentor-title__link">Documentation</a></h1>
+    <input class="phpdocumentor-header__menu-button" type="checkbox" id="menu-button" name="menu-button" />
+    <label class="phpdocumentor-header__menu-icon" for="menu-button">
+        <i class="fas fa-bars"></i>
+    </label>
+    <section data-search-form class="phpdocumentor-search">
+    <label>
+        <span class="visually-hidden">Search for</span>
+        <svg class="phpdocumentor-search__icon" width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+            <circle cx="7.5" cy="7.5" r="6.5" stroke="currentColor" stroke-width="2"/>
+            <line x1="12.4892" y1="12.2727" x2="19.1559" y2="18.9393" stroke="currentColor" stroke-width="3"/>
+        </svg>
+        <input type="search" class="phpdocumentor-field phpdocumentor-search__field" placeholder="Loading .." disabled />
+    </label>
+</section>
+
+    <nav class="phpdocumentor-topnav">
+    <ul class="phpdocumentor-topnav__menu">
+        </ul>
+</nav>
+</header>
+
+    <main class="phpdocumentor">
+        <div class="phpdocumentor-section">
+            <input class="phpdocumentor-sidebar__menu-button" type="checkbox" id="sidebar-button" name="sidebar-button" />
+<label class="phpdocumentor-sidebar__menu-icon" for="sidebar-button">
+    Menu
+</label>
+<aside class="phpdocumentor-column -four phpdocumentor-sidebar">
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Namespaces</h2>
+                                <h3 class="phpdocumentor-sidebar__root-namespace"><a href="namespaces/default.html"><abbr title="\">Global</abbr></a></h3>
+                                    </section>
+
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Reports</h2>
+                <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/deprecated.html">Deprecated</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/errors.html">Errors</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/markers.html">Markers</a></h3>
+    </section>
+
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Indices</h2>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="indices/files.html">Files</a></h3>
+    </section>
+</aside>
+
+            <div class="phpdocumentor-column -eight phpdocumentor-content">
+                    <ul class="phpdocumentor-breadcrumbs">
+    </ul>
+
+    <article class="phpdocumentor-element -package">
+        <h2 class="phpdocumentor-content__title">API Documentation</h2>
+
+        <h3 id="packages">
+    Packages
+    <a href="#packages" class="headerlink"><i class="fas fa-link"></i></a>
+</h3>
+
+<dl class="phpdocumentor-table-of-contents">
+            <dt class="phpdocumentor-table-of-contents__entry -package"><a href="packages/Default.html"><abbr title="\Default">Default</abbr></a></dt>
+    </dl>
+
+
+
+
+
+        
+
+        
+    </article>
+                <section data-search-results class="phpdocumentor-search-results phpdocumentor-search-results--hidden">
+    <section class="phpdocumentor-search-results__dialog">
+        <header class="phpdocumentor-search-results__header">
+            <h2 class="phpdocumentor-search-results__title">Search results</h2>
+            <button class="phpdocumentor-search-results__close"><i class="fas fa-times"></i></button>
+        </header>
+        <section class="phpdocumentor-search-results__body">
+            <ul class="phpdocumentor-search-results__entries"></ul>
+        </section>
+    </section>
+</section>
+            </div>
+        </div>
+        <a href="packages/default.html#top" class="phpdocumentor-back-to-top"><i class="fas fa-chevron-circle-up"></i></a>
+
+    </main>
+
+    <script>
+        cssVars({});
+    </script>
+</body>
+</html>

+ 106 - 0
Doc/reports/deprecated.html

@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title>    Documentation &raquo; Deprecated elements
+</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <base href="../">
+    <link rel="icon" href="images/favicon.ico"/>
+    <link rel="stylesheet" href="css/normalize.css">
+    <link rel="stylesheet" href="css/base.css">
+            <link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap" rel="stylesheet">
+        <link rel="stylesheet" href="css/template.css">
+        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/css/all.min.css" integrity="sha256-ybRkN9dBjhcS2qrW1z+hfCxq+1aBdwyQM5wlQoQVt/0=" crossorigin="anonymous" />
+                <script src="https://cdn.jsdelivr.net/npm/fuse.js@3.4.6"></script>
+        <script src="https://cdn.jsdelivr.net/npm/css-vars-ponyfill@2"></script>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/js/all.min.js" integrity="sha256-0vuk8LXoyrmCjp1f0O300qo1M75ZQyhH9X3J6d+scmk=" crossorigin="anonymous"></script>
+        <script src="js/search.js"></script>
+        <script defer src="js/searchIndex.js"></script>
+    </head>
+<body id="top">
+    <header class="phpdocumentor-header phpdocumentor-section">
+    <h1 class="phpdocumentor-title"><a href="" class="phpdocumentor-title__link">Documentation</a></h1>
+    <input class="phpdocumentor-header__menu-button" type="checkbox" id="menu-button" name="menu-button" />
+    <label class="phpdocumentor-header__menu-icon" for="menu-button">
+        <i class="fas fa-bars"></i>
+    </label>
+    <section data-search-form class="phpdocumentor-search">
+    <label>
+        <span class="visually-hidden">Search for</span>
+        <svg class="phpdocumentor-search__icon" width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+            <circle cx="7.5" cy="7.5" r="6.5" stroke="currentColor" stroke-width="2"/>
+            <line x1="12.4892" y1="12.2727" x2="19.1559" y2="18.9393" stroke="currentColor" stroke-width="3"/>
+        </svg>
+        <input type="search" class="phpdocumentor-field phpdocumentor-search__field" placeholder="Loading .." disabled />
+    </label>
+</section>
+
+    <nav class="phpdocumentor-topnav">
+    <ul class="phpdocumentor-topnav__menu">
+        </ul>
+</nav>
+</header>
+
+    <main class="phpdocumentor">
+        <div class="phpdocumentor-section">
+            <input class="phpdocumentor-sidebar__menu-button" type="checkbox" id="sidebar-button" name="sidebar-button" />
+<label class="phpdocumentor-sidebar__menu-icon" for="sidebar-button">
+    Menu
+</label>
+<aside class="phpdocumentor-column -four phpdocumentor-sidebar">
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Namespaces</h2>
+                                <h3 class="phpdocumentor-sidebar__root-namespace"><a href="namespaces/default.html"><abbr title="\">Global</abbr></a></h3>
+                                    </section>
+
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Reports</h2>
+                <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/deprecated.html">Deprecated</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/errors.html">Errors</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/markers.html">Markers</a></h3>
+    </section>
+
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Indices</h2>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="indices/files.html">Files</a></h3>
+    </section>
+</aside>
+
+            <div class="phpdocumentor-column -eight phpdocumentor-content">
+                    <ul class="phpdocumentor-breadcrumbs">
+        <li><a href="">Home</a></li>
+    </ul>
+
+    <div class="phpdocumentor-row">
+        <h2 class="phpdocumentor-content__title">Deprecated</h2>
+
+        
+                    <div class="phpdocumentor-admonition phpdocumentor-admonition--success">
+                No deprecated elements have been found in this project.
+            </div>
+            </div>
+                <section data-search-results class="phpdocumentor-search-results phpdocumentor-search-results--hidden">
+    <section class="phpdocumentor-search-results__dialog">
+        <header class="phpdocumentor-search-results__header">
+            <h2 class="phpdocumentor-search-results__title">Search results</h2>
+            <button class="phpdocumentor-search-results__close"><i class="fas fa-times"></i></button>
+        </header>
+        <section class="phpdocumentor-search-results__body">
+            <ul class="phpdocumentor-search-results__entries"></ul>
+        </section>
+    </section>
+</section>
+            </div>
+        </div>
+        <a href="reports/deprecated.html#top" class="phpdocumentor-back-to-top"><i class="fas fa-chevron-circle-up"></i></a>
+
+    </main>
+
+    <script>
+        cssVars({});
+    </script>
+</body>
+</html>

+ 105 - 0
Doc/reports/errors.html

@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title>    Documentation &raquo; Compilation errors
+</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <base href="../">
+    <link rel="icon" href="images/favicon.ico"/>
+    <link rel="stylesheet" href="css/normalize.css">
+    <link rel="stylesheet" href="css/base.css">
+            <link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap" rel="stylesheet">
+        <link rel="stylesheet" href="css/template.css">
+        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/css/all.min.css" integrity="sha256-ybRkN9dBjhcS2qrW1z+hfCxq+1aBdwyQM5wlQoQVt/0=" crossorigin="anonymous" />
+                <script src="https://cdn.jsdelivr.net/npm/fuse.js@3.4.6"></script>
+        <script src="https://cdn.jsdelivr.net/npm/css-vars-ponyfill@2"></script>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/js/all.min.js" integrity="sha256-0vuk8LXoyrmCjp1f0O300qo1M75ZQyhH9X3J6d+scmk=" crossorigin="anonymous"></script>
+        <script src="js/search.js"></script>
+        <script defer src="js/searchIndex.js"></script>
+    </head>
+<body id="top">
+    <header class="phpdocumentor-header phpdocumentor-section">
+    <h1 class="phpdocumentor-title"><a href="" class="phpdocumentor-title__link">Documentation</a></h1>
+    <input class="phpdocumentor-header__menu-button" type="checkbox" id="menu-button" name="menu-button" />
+    <label class="phpdocumentor-header__menu-icon" for="menu-button">
+        <i class="fas fa-bars"></i>
+    </label>
+    <section data-search-form class="phpdocumentor-search">
+    <label>
+        <span class="visually-hidden">Search for</span>
+        <svg class="phpdocumentor-search__icon" width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+            <circle cx="7.5" cy="7.5" r="6.5" stroke="currentColor" stroke-width="2"/>
+            <line x1="12.4892" y1="12.2727" x2="19.1559" y2="18.9393" stroke="currentColor" stroke-width="3"/>
+        </svg>
+        <input type="search" class="phpdocumentor-field phpdocumentor-search__field" placeholder="Loading .." disabled />
+    </label>
+</section>
+
+    <nav class="phpdocumentor-topnav">
+    <ul class="phpdocumentor-topnav__menu">
+        </ul>
+</nav>
+</header>
+
+    <main class="phpdocumentor">
+        <div class="phpdocumentor-section">
+            <input class="phpdocumentor-sidebar__menu-button" type="checkbox" id="sidebar-button" name="sidebar-button" />
+<label class="phpdocumentor-sidebar__menu-icon" for="sidebar-button">
+    Menu
+</label>
+<aside class="phpdocumentor-column -four phpdocumentor-sidebar">
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Namespaces</h2>
+                                <h3 class="phpdocumentor-sidebar__root-namespace"><a href="namespaces/default.html"><abbr title="\">Global</abbr></a></h3>
+                                    </section>
+
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Reports</h2>
+                <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/deprecated.html">Deprecated</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/errors.html">Errors</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/markers.html">Markers</a></h3>
+    </section>
+
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Indices</h2>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="indices/files.html">Files</a></h3>
+    </section>
+</aside>
+
+            <div class="phpdocumentor-column -eight phpdocumentor-content">
+                <ul class="phpdocumentor-breadcrumbs">
+    <li><a href="">Home</a></li>
+</ul>
+
+<div class="phpdocumentor-row">
+    <h2 class="phpdocumentor-content__title">Errors</h2>
+
+    
+            <div class="phpdocumentor-admonition phpdocumentor-admonition--success">No errors have been found in this project.</div>
+    
+    </div>
+                <section data-search-results class="phpdocumentor-search-results phpdocumentor-search-results--hidden">
+    <section class="phpdocumentor-search-results__dialog">
+        <header class="phpdocumentor-search-results__header">
+            <h2 class="phpdocumentor-search-results__title">Search results</h2>
+            <button class="phpdocumentor-search-results__close"><i class="fas fa-times"></i></button>
+        </header>
+        <section class="phpdocumentor-search-results__body">
+            <ul class="phpdocumentor-search-results__entries"></ul>
+        </section>
+    </section>
+</section>
+            </div>
+        </div>
+        <a href="reports/errors.html#top" class="phpdocumentor-back-to-top"><i class="fas fa-chevron-circle-up"></i></a>
+
+    </main>
+
+    <script>
+        cssVars({});
+    </script>
+</body>
+</html>

+ 106 - 0
Doc/reports/markers.html

@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title>    Documentation &raquo; Markers
+</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <base href="../">
+    <link rel="icon" href="images/favicon.ico"/>
+    <link rel="stylesheet" href="css/normalize.css">
+    <link rel="stylesheet" href="css/base.css">
+            <link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap" rel="stylesheet">
+        <link rel="stylesheet" href="css/template.css">
+        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/css/all.min.css" integrity="sha256-ybRkN9dBjhcS2qrW1z+hfCxq+1aBdwyQM5wlQoQVt/0=" crossorigin="anonymous" />
+                <script src="https://cdn.jsdelivr.net/npm/fuse.js@3.4.6"></script>
+        <script src="https://cdn.jsdelivr.net/npm/css-vars-ponyfill@2"></script>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/js/all.min.js" integrity="sha256-0vuk8LXoyrmCjp1f0O300qo1M75ZQyhH9X3J6d+scmk=" crossorigin="anonymous"></script>
+        <script src="js/search.js"></script>
+        <script defer src="js/searchIndex.js"></script>
+    </head>
+<body id="top">
+    <header class="phpdocumentor-header phpdocumentor-section">
+    <h1 class="phpdocumentor-title"><a href="" class="phpdocumentor-title__link">Documentation</a></h1>
+    <input class="phpdocumentor-header__menu-button" type="checkbox" id="menu-button" name="menu-button" />
+    <label class="phpdocumentor-header__menu-icon" for="menu-button">
+        <i class="fas fa-bars"></i>
+    </label>
+    <section data-search-form class="phpdocumentor-search">
+    <label>
+        <span class="visually-hidden">Search for</span>
+        <svg class="phpdocumentor-search__icon" width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+            <circle cx="7.5" cy="7.5" r="6.5" stroke="currentColor" stroke-width="2"/>
+            <line x1="12.4892" y1="12.2727" x2="19.1559" y2="18.9393" stroke="currentColor" stroke-width="3"/>
+        </svg>
+        <input type="search" class="phpdocumentor-field phpdocumentor-search__field" placeholder="Loading .." disabled />
+    </label>
+</section>
+
+    <nav class="phpdocumentor-topnav">
+    <ul class="phpdocumentor-topnav__menu">
+        </ul>
+</nav>
+</header>
+
+    <main class="phpdocumentor">
+        <div class="phpdocumentor-section">
+            <input class="phpdocumentor-sidebar__menu-button" type="checkbox" id="sidebar-button" name="sidebar-button" />
+<label class="phpdocumentor-sidebar__menu-icon" for="sidebar-button">
+    Menu
+</label>
+<aside class="phpdocumentor-column -four phpdocumentor-sidebar">
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Namespaces</h2>
+                                <h3 class="phpdocumentor-sidebar__root-namespace"><a href="namespaces/default.html"><abbr title="\">Global</abbr></a></h3>
+                                    </section>
+
+    
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Reports</h2>
+                <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/deprecated.html">Deprecated</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/errors.html">Errors</a></h3>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="reports/markers.html">Markers</a></h3>
+    </section>
+
+    <section class="phpdocumentor-sidebar__category">
+        <h2 class="phpdocumentor-sidebar__category-header">Indices</h2>
+        <h3 class="phpdocumentor-sidebar__root-package"><a href="indices/files.html">Files</a></h3>
+    </section>
+</aside>
+
+            <div class="phpdocumentor-column -eight phpdocumentor-content">
+                    <ul class="phpdocumentor-breadcrumbs">
+        <li><a href="">Home</a></li>
+    </ul>
+
+    <div class="phpdocumentor-row">
+        <h2 class="phpdocumentor-content__title">Markers</h2>
+
+                    <div class="phpdocumentor-admonition phpdocumentor-admonition--success">
+                No markers have been found in this project.
+            </div>
+        
+            </div>
+                <section data-search-results class="phpdocumentor-search-results phpdocumentor-search-results--hidden">
+    <section class="phpdocumentor-search-results__dialog">
+        <header class="phpdocumentor-search-results__header">
+            <h2 class="phpdocumentor-search-results__title">Search results</h2>
+            <button class="phpdocumentor-search-results__close"><i class="fas fa-times"></i></button>
+        </header>
+        <section class="phpdocumentor-search-results__body">
+            <ul class="phpdocumentor-search-results__entries"></ul>
+        </section>
+    </section>
+</section>
+            </div>
+        </div>
+        <a href="reports/markers.html#top" class="phpdocumentor-back-to-top"><i class="fas fa-chevron-circle-up"></i></a>
+
+    </main>
+
+    <script>
+        cssVars({});
+    </script>
+</body>
+</html>

BIN
THURfiles-logo-200.png


+ 334 - 0
api/Sf/Admin.php

@@ -0,0 +1,334 @@
+<?php
+/**
+ * Sf_Admin
+ *
+ * @author André Genrich <andre.genrich@thurdata.ch>
+ * @author Roland Käser <roland.keaser@thurdata.ch>
+ * @version 0.9
+ * @copyright Copyright (c) 2021, Thurdata
+ * @example ../test.php
+ */
+/**
+ * Sf_Admin class documentation
+ */
+/**
+ * Sf_Admin is a class which allows to manage Seafile accounts via web-api/v2.1-admin
+ *
+ * You may create, modify, migrate, delete and get the attributes of a Seafile account using this class
+ *
+ * For the usage examples of all class methods check the source code of test.php
+ */
+class Sf_Admin {
+    private $loginSuccess;
+    private $constructorSuccess;
+    private $sfURL;
+    private $sfConType;
+    private $sfPort;
+    private $sfSecure;
+    private $sfAdminName;
+    private $sfPassword;
+    protected $sfToken;
+	/**
+	 * Constructor
+         * @param string $seafileURL Seafile URL (example: https://seafile.my.lan)
+	 * @param string $username admin/user account's e-mail
+	 * @param string $password admin/user account's password
+	 * @param string $secure optional false to force unsecure (default true)
+	 */
+    function __construct($seafileURL, $username, $password, $secure=true) {
+        if(!in_array('curl', get_loaded_extensions())) {
+            $this->constructorSuccess = false;
+            return array('error_msg' => 'Error: PHP curl extension not available');
+        }
+        if (empty($seafileURL) || empty($username) || empty($password)) {
+            $this->constructorSuccess = false;
+            return array('error_msg' => 'Error: Server login info missing, check server configuration');
+        }
+        if(preg_match('/^https/', $seafileURL)) {
+            $this->sfConType = 'https://';
+            if($secure) {
+                $this->sfSecure = true;
+            } else {
+                $this->sfSecure = false;
+            }
+        }else {
+            $this->sfConType = 'http://';
+            $this->sfSecure = false;
+        }
+        $sfHostname = str_replace(array('http://', 'https://'), array('',''), $seafileURL);
+        $sfHostname = explode(':', $sfHostname);
+        if (gethostbyname($sfHostname[0]) == $sfHostname[0] && !filter_var($sfHostname[0], FILTER_VALIDATE_IP)) {
+            $this->constructorSuccess = false;
+            return array('error_msg' => 'Error: Cannot resolve ' . $sfHostname[0] . ', check server configuration');
+        }
+        $this->sfPort = ($sfHostname[1]) ? $sfHostname[1] :  '8000';
+        $this->sfURL = $this->sfConType . $sfHostname[0] . ':' . $this->sfPort;
+        $this->sfAdminName = $username;
+        $this->sfPassword = $password;
+        $this->sfToken = null;
+        $this->constructorSuccess = true;
+    }
+
+    public function constructorSuccess() {
+        return $this->constructorSuccess;
+    }
+	/**
+	 * login
+	 * 
+	 * fetch and set seafile lofin token
+	 * @return array error or true
+	 */
+    public function login() {
+        if (!$this->constructorSuccess()) {
+                return array('error_msg' => 'Error: construct failed, something missing');
+        }
+        $sfClient = curl_init();
+        
+        curl_setopt($sfClient, CURLOPT_URL, $this->sfURL . '/api2/auth-token/');
+        curl_setopt($sfClient, CURLOPT_CONNECTTIMEOUT, '30');
+        curl_setopt($sfClient, CURLOPT_POST, true);
+        curl_setopt($sfClient, CURLOPT_FOLLOWLOCATION, true);
+        curl_setopt($sfClient, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($sfClient, CURLOPT_POSTFIELDS, array('username' => $this->sfAdminName, 'password' => $this->sfPassword));
+        if(!$this->sfSecure) {
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYPEER, false);
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYHOST, false);
+        }
+        curl_setopt($sfClient, CURLOPT_HEADER, false);
+        $authResponse = curl_exec($sfClient);
+        $responseCode = curl_getinfo($sfClient, CURLINFO_RESPONSE_CODE);
+        if($responseCode != 200) {
+            curl_close($sfClient);
+            unset($sfClient);
+            return array('error_msg' => $authResponse, 'response_code' => $responseCode);
+        };
+        curl_close($sfClient);
+        unset($sfClient);
+        
+        $authResponseData = json_decode($authResponse, true);
+        if (!$authResponseData['token']) {
+                $this->loginSuccess = false;
+                error_log(print_r($authResponseData,true));
+                return array('error_msg' => $authResponse);
+        } else {
+                $this->sfToken = $authResponseData['token'];
+                $this->loginSuccess = true;
+                return true;
+        }
+    }
+	/**
+	 * loginSuccess
+	 * 
+	 * @return bool
+	 */
+    public function loginSuccess() {
+        return $this->loginSuccess;
+    }
+	/**
+	 * getAllAccounts
+	 * 
+	 * @return array of seafile accounts array of informations or error message
+	 */
+    public function getAllAccounts() {
+        if (!$this->loginSuccess()) {
+            return array('error_msg' => 'Error: not authenticated');
+        }
+        $sfClient = curl_init();
+        curl_setopt($sfClient, CURLOPT_URL, $this->sfURL . '/api/v2.1/admin/users/');
+        curl_setopt($sfClient, CURLOPT_CONNECTTIMEOUT, '30');
+        curl_setopt($sfClient, CURLOPT_FOLLOWLOCATION, true);
+        curl_setopt($sfClient, CURLOPT_RETURNTRANSFER, true);
+        if(!$this->sfSecure) {
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYPEER, false);
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYHOST, false);
+        }
+        curl_setopt($sfClient, CURLOPT_HTTPHEADER, array( 'Authorization: Token ' . $this->sfToken, 'Accept: application/json; charset=utf-8; indent=4'));
+        $response = curl_exec($sfClient);
+        if(curl_getinfo($sfClient, CURLINFO_RESPONSE_CODE) != 200) {
+            curl_close($sfClient);
+            return array('error_msg' => $response);
+        };
+        curl_close($sfClient);
+        return json_decode($response, true);
+    }
+	/**
+	 * getAccount
+	 * 
+	 * @param string $email login e-mail
+	 * 
+	 * @return array of account informations or error message
+	 */
+    public function getAccount($email) {
+        if (!$this->loginSuccess()) {
+            return array('error_msg' => 'Error: not authenticated');
+        }
+        $sfClient = curl_init();
+        curl_setopt($sfClient, CURLOPT_URL, $this->sfURL . '/api/v2.1/admin/users/' . $email . '/');
+        curl_setopt($sfClient, CURLOPT_CONNECTTIMEOUT, '30');
+        curl_setopt($sfClient, CURLOPT_FOLLOWLOCATION, true);
+        curl_setopt($sfClient, CURLOPT_RETURNTRANSFER, true);
+        if(!$this->sfSecure) {
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYPEER, false);
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYHOST, false);
+        }
+        curl_setopt($sfClient, CURLOPT_HTTPHEADER, array( 'Authorization: Token ' . $this->sfToken, 'Accept: application/json; charset=utf-8; indent=4'));
+        $response = curl_exec($sfClient);
+        if(curl_getinfo($sfClient, CURLINFO_RESPONSE_CODE) != 200) {
+            curl_close($sfClient);
+            return array('error_msg' => $response);
+        };
+        curl_close($sfClient);
+        return json_decode($response, true);
+	}
+	/**
+	 * getAccount
+	 * 
+	 * @param array $params avvount informations, email required.
+     * 
+	 * @see https://download.seafile.com/published/web-api/v2.1-admin/accounts.md#user-content-Add%20User
+     * 
+	 * @return array of account informations or error message
+	 */
+    public function createAccount($params) {
+        if (!$this->loginSuccess()) {
+            return array('error_msg' => 'Error: not authenticated');
+        }
+        if(!isset($params['email'])) {
+            return array('error_msg' => 'Error: missing parameter email');
+        }
+        $sfClient = curl_init();
+        curl_setopt($sfClient, CURLOPT_URL, $this->sfURL . '/api/v2.1/admin/users/');
+        curl_setopt($sfClient, CURLOPT_CONNECTTIMEOUT, '30');
+        curl_setopt($sfClient, CURLOPT_FOLLOWLOCATION, true);
+        curl_setopt($sfClient, CURLOPT_RETURNTRANSFER, true);
+        if(!$this->sfSecure) {
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYPEER, false);
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYHOST, false);
+        }
+        curl_setopt($sfClient, CURLOPT_HTTPHEADER, array( 'Authorization: Token ' . $this->sfToken, 'Accept: application/json; charset=utf-8; indent=4'));
+		curl_setopt($sfClient, CURLOPT_POST, 1);
+		curl_setopt($sfClient, CURLOPT_POSTFIELDS, $params);
+        $response = curl_exec($sfClient);
+        if(curl_getinfo($sfClient, CURLINFO_RESPONSE_CODE) != 200) {
+            curl_close($sfClient);
+            return array('error_msg' => $response);
+        };
+        curl_close($sfClient);
+        return json_decode($response, true);
+	}
+	/**
+	 * modifyAccount
+	 * 
+	 * @param array $params avvount informations, email required.
+     * 
+	 * @see https://download.seafile.com/published/web-api/v2.1-admin/accounts.md#user-content-Add%20User
+     * 
+	 * @return array of account informations or error message
+	 */
+    public function modifyAccount($params) {
+        if (!$this->loginSuccess()) {
+            return array('error_msg' => 'Error: not authenticated');
+        }
+        if(!isset($params['email'])) {
+            return array('error_msg' => 'Error: missing parameter email');
+        }
+        $account = $params['email'];
+        unset($params['email']);
+        $sfClient = curl_init();
+        curl_setopt($sfClient, CURLOPT_URL, $this->sfURL . '/api/v2.1/admin/users/' . $account . '/');
+		curl_setopt($sfClient, CURLOPT_CUSTOMREQUEST, 'PUT');
+        curl_setopt($sfClient, CURLOPT_CONNECTTIMEOUT, '30');
+        curl_setopt($sfClient, CURLOPT_FOLLOWLOCATION, true);
+        curl_setopt($sfClient, CURLOPT_RETURNTRANSFER, true);
+        if(!$this->sfSecure) {
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYPEER, false);
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYHOST, false);
+        }
+        curl_setopt($sfClient, CURLOPT_HTTPHEADER, array( 'Authorization: Token ' . $this->sfToken, 'Accept: application/json; charset=utf-8; indent=4'));
+		curl_setopt($sfClient, CURLOPT_POST, 1);
+		curl_setopt($sfClient, CURLOPT_POSTFIELDS, $params);
+        $response = curl_exec($sfClient);
+        if(curl_getinfo($sfClient, CURLINFO_RESPONSE_CODE) != 200) {
+            curl_close($sfClient);
+            return array('error_msg' => $response);
+        };
+        curl_close($sfClient);
+        return json_decode($response, true);
+	}
+	/**
+	 * deleteAccount
+	 * 
+	 * @param string $email login e-mail
+	 * 
+	 * @return array success => true or error message
+	 */
+    public function deleteAccount($email)
+	{
+        if (!$this->loginSuccess()) {
+            return array('error_msg' => 'Error: not authenticated');
+        }
+        if(!isset($email)) {
+            return array('error_msg' => 'Error: missing parameter email');
+        }
+        $sfClient = curl_init();
+        curl_setopt($sfClient, CURLOPT_URL, $this->sfURL . '/api/v2.1/admin/users/' . $email . '/');
+		curl_setopt($sfClient, CURLOPT_CUSTOMREQUEST, 'DELETE');
+        curl_setopt($sfClient, CURLOPT_CONNECTTIMEOUT, '30');
+        curl_setopt($sfClient, CURLOPT_FOLLOWLOCATION, true);
+        curl_setopt($sfClient, CURLOPT_RETURNTRANSFER, true);
+        if(!$this->sfSecure) {
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYPEER, false);
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYHOST, false);
+        }
+        curl_setopt($sfClient, CURLOPT_HTTPHEADER, array( 'Authorization: Token ' . $this->sfToken, 'Accept: application/json; charset=utf-8; indent=4'));
+        $response = curl_exec($sfClient);
+        if(curl_getinfo($sfClient, CURLINFO_RESPONSE_CODE) != 200) {
+            curl_close($sfClient);
+            return array('error_msg' => $response);
+        };
+        curl_close($sfClient);
+        return json_decode($response, true);
+	}
+	/**
+	 * migrateAccount
+	 * 
+	 * @param string $from source account login e-mail
+	 * @param string $to destination account login e-mail (must exist)
+	 * 
+	 * @return array success => true or error message
+	 */
+    public function migrateAccount($from, $to)
+	{
+        if (!$this->loginSuccess()) {
+            return array('error_msg' => 'Error: not authenticated');
+        }
+        if(!isset($from)) {
+            return array('error_msg' => 'Error: missing parameter from');
+        }
+        if(!isset($to)) {
+            return array('error_msg' => 'Error: missing parameter to');
+        }
+        $postFields = array();
+        $postFields['op'] = 'migrate';
+        $postFields['to_user'] = $to;
+        $sfClient = curl_init();
+        curl_setopt($sfClient, CURLOPT_URL, $this->sfURL . '/api2/accounts/' . $from . '/');
+        curl_setopt($sfClient, CURLOPT_CONNECTTIMEOUT, '30');
+        curl_setopt($sfClient, CURLOPT_FOLLOWLOCATION, true);
+        curl_setopt($sfClient, CURLOPT_RETURNTRANSFER, true);
+        if(!$this->sfSecure) {
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYPEER, false);
+            curl_setopt($sfClient, CURLOPT_SSL_VERIFYHOST, false);
+        }
+        curl_setopt($sfClient, CURLOPT_HTTPHEADER, array( 'Authorization: Token ' . $this->sfToken, 'Accept: application/json; charset=utf-8; indent=4'));
+        curl_setopt($sfClient, CURLOPT_POST, 1);
+		curl_setopt($sfClient, CURLOPT_POSTFIELDS, $postFields);
+        $response = curl_exec($sfClient);
+        if(curl_getinfo($sfClient, CURLINFO_RESPONSE_CODE) != 200) {
+            curl_close($sfClient);
+            return array('error_msg' => $response);
+        };
+        curl_close($sfClient);
+        return json_decode($response, true);
+	}
+}

+ 10 - 0
api/config.php

@@ -0,0 +1,10 @@
+<?php
+////////////
+// Config //
+////////////
+
+$seafileURL = 'https://files.thurdata.ch:443';
+$seafileAdminEmail = 'info@thurdata.ch';
+$seafileAdminPassword = '';
+
+?>

+ 169 - 0
api/test.php

@@ -0,0 +1,169 @@
+<?php
+
+/**
+ * test.php
+ *
+ * contains examples about how to use 
+ * class methods for Sf_Admin
+ *
+ * @author André Genrich <andre.genrich@thurdata.ch>
+ * @version 1
+ * @copyright Copyright (c) Thurdata GmbH 2020
+ * @license GPL
+ * @name test.php
+ */
+
+/////////////
+// Require //
+/////////////
+
+require_once('config.php');
+require_once('Sf/Admin.php');
+
+//////////
+// Args //
+//////////
+
+if(PHP_SAPI != 'cli')
+	$args = $_GET;
+else
+	$args = parse_args($argv);
+
+if(isset($args['action']))
+{
+	$action = $args['action'];
+}
+else
+{
+	echo 'No action, exiting' . PHP_EOL;
+	exit (-1);
+}
+
+function parse_args($argv){
+	array_shift($argv);
+	$out = array();
+	foreach ($argv as $arg){
+		if (substr($arg,0,2) == '--'){
+			$eqPos = strpos($arg,'=');
+			if ($eqPos === false){
+				$key = substr($arg,2);
+				$out[$key] = isset($out[$key]) ? $out[$key] : true;
+			} else {
+				$key = substr($arg,2,$eqPos-2);
+				$out[$key] = substr($arg,$eqPos+1);
+			}
+		} else if (substr($arg,0,1) == '-'){
+			if (substr($arg,2,1) == '='){
+				$key = substr($arg,1,1);
+				$out[$key] = substr($arg,3);
+			} else {
+				$chars = str_split(substr($arg,1));
+				foreach ($chars as $char){
+					$key = $char;
+					$out[$key] = isset($out[$key]) ? $out[$key] : true;
+				}
+			}
+		} else {
+			$out[] = $arg;
+		}
+	}
+	return $out;
+}
+
+///////////
+// Login //
+///////////
+
+$sf = new Sf_Admin($seafileURL, $seafileAdminEmail, $seafileAdminPassword);
+$r = $sf->login();
+if(isset($r['error_msg'])) {
+	echo 'Error : cannot login to ' . $seafileURL . ' :-(' . PHP_EOL;
+	print_r($r);
+	exit();
+}
+
+/////////////
+// Actions //
+/////////////
+
+// nop
+if($action == 'nop')
+{
+    echo 'OK : login success, no further operation :-)' . PHP_EOL;
+    exit;
+}
+
+// Get All Accounts
+if($action == 'gaa')
+{
+    $r = $sf->getAllAccounts();
+	if(isset($r['error_msg'])) {
+        echo 'Error : could not fetch list of accounts for '. $seafileURL . ' :-(' . PHP_EOL;
+        print_r($r);
+	} else {
+        echo 'OK : got a list of '. $r['total_count'] . ' accounts for ' . $seafileURL . ' :-)' . PHP_EOL;
+    }
+}
+
+// Get Account Informations
+if($action == 'gai')
+{
+	$r = $sf->getAccount($args['account_name']);
+	if(isset($r['error_msg'])) {
+        echo 'Error : could not fetch information of '. $args['account_name'] . ' :-(' . PHP_EOL;
+        print_r($r);
+	} else {
+        echo 'OK : got the infos for account ' . $args['account_name'] . ' :-)' . PHP_EOL;
+    }
+}
+
+// Create Account
+if($action == 'ca')
+{
+	$attrs = array('email'=> $args['account_name'], 'password'=> $args['password']);
+	$r = $sf->createAccount($attrs);
+	if(isset($r['error_msg'])) {
+		echo 'Error : cannot create account ' . $args['account_name'] . ' :-(' . PHP_EOL;
+        print_r($r);
+	} else {
+		echo 'OK : account ' . $args['account_name'] . ' created :-)' . PHP_EOL;
+    }
+}
+
+// Modify Account
+if($action == 'moa')
+{
+    $attrs = array('email'=> $args['account_name'], 'quota_total' => $args['quota_total']);
+	$r = $sf->modifyAccount($attrs);
+	if(isset($r['error_msg'])) {
+		echo 'Error : cannot modify account ' . $args['account_name'] . ' :-(' . PHP_EOL;
+		print_r($r);
+	} else {
+		echo 'OK : modify account ' . $args['account_name'] . ' :-)' . PHP_EOL;
+		print_r($r);
+	}
+}
+
+// Migrate Account
+if($action == 'mia')
+{
+	$r = $sf->migrateAccount($args['account_name'], $args['new_account_name']);
+	if(isset($r['error_msg'])) {
+		echo 'Error : account ' . $args['account_name'] . ' not migrated to ' . $args['new_account_name'] . ' :-(' . PHP_EOL;
+		print_r($r);
+	} else {
+		echo 'OK : account ' . $args['account_name'] . ' migrated to ' . $args['new_account_name'] . ' :-)' . PHP_EOL;
+	}
+}
+
+// Delete Account
+if($action == 'da')
+{
+	$r = $sf->deleteAccount($args['account_name']);
+	if(isset($r['error_msg'])) {
+		echo 'Error : account ' . $args['account_name'] . ' not deleted :-(' . PHP_EOL;
+		print_r($r);
+	} else {
+		echo 'OK : account ' . $args['account_name'] . ' deleted :-)' . PHP_EOL;
+	}
+}

BIN
apple.png


BIN
apple_store.png


+ 433 - 0
clientarea.tpl

@@ -0,0 +1,433 @@
+{*
+ **********************************************************
+ * Developed by: Team Theme Metro
+ * Website: http://www.thememetro.com
+ * Customized ny thurdata
+ **********************************************************
+*}
+{if $modulechangepwresult}
+  {if $modulechangepwresult == "success"}
+    {include file="$template/includes/alert.tpl" type="success" msg=$modulechangepasswordmessage textcenter=true}
+  {elseif $modulechangepwresult == "error"}
+    {include file="$template/includes/alert.tpl" type="error" msg=$modulechangepasswordmessage|strip_tags textcenter=true}
+  {/if}
+{/if}
+
+{if $modulecustombuttonresult}
+  {if $modulecustombuttonresult == "success"}
+    {include file="$template/includes/alert.tpl" type="success" msg=$LANG.moduleactionsuccess textcenter=true idname="alertModuleCustomButtonSuccess"}
+  {else}
+    {include file="$template/includes/alert.tpl" type="error" msg=$LANG.moduleactionfailed|cat:' ':$modulecustombuttonresult textcenter=true idname="alertModuleCustomButtonFailed"}
+  {/if}
+{/if}
+{if $pendingcancellation}
+    {include file="$template/includes/alert.tpl" type="error" msg=$LANG.cancellationrequestedexplanation textcenter=true idname="alertPendingCancellation"}
+{/if}
+{if $unpaidInvoice}
+  <div class="alert alert-{if $unpaidInvoiceOverdue}danger{else}warning{/if}" id="alert{if $unpaidInvoiceOverdue}Overdue{else}Unpaid{/if}Invoice">
+    <div class="pull-right">
+      <a href="viewinvoice.php?id={$unpaidInvoice}" class="btn btn-xs btn-default">
+        {lang key='payInvoice'}
+      </a>
+    </div>
+    {$unpaidInvoiceMessage}
+  </div>
+{/if}
+<div class="tab-content margin-bottom">
+  <div class="tab-pane fade show active" id="tabOverview">
+    {if $tplOverviewTabOutput}
+			{$tplOverviewTabOutput}
+    {else}
+      <div class="section">
+        <div class="product-details">
+          <div class="row row-eq-height row-eq-height-sm">
+            <div class="col-md-6">
+              <div class="product-holder product-status-{$rawstatus|strtolower}" style="min-height: unset; height:210px">
+                <div class="product-content">
+                  <div class="product-image">
+                    <div class="feature-icon">
+                      {if $moduleParams.configoption3 == 'on'}
+                        <img src="/templates/croster/thurdata/productgroups/2.svg" class="img-fluid" style="height:100px;">
+                      {else}
+                        <img src="/templates/croster/thurdata/productgroups/2.svg" class="img-fluid" style="height:100px;">
+                      {/if}
+                    </div>
+                  </div>
+                  <h4><small>{$groupname}</small> - {$product}</h4>
+                  <div class="status-sticker-wrapper">
+                    <div class="status-sticker product-status-{$rawstatus|strtolower}">
+                      {$status}
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="col-md-6">
+              <div class="product-info" style="min-height: unset; height:210px;">
+                <table width="100%" border="0">
+            	    <tr>
+            		<td class="list-heading" style="font-size: 85%;">{$LANG.clientareahostingregdate}</td>
+            		<td class="list-text"  style="font-size: 85%;">{$regdate}</td>
+            	    </tr>
+            	    {if $billingcycle != 'Gratis-Account'}
+            		<tr>
+            		    <td class="list-heading" style="font-size: 85%;">{$LANG.firstpaymentamount}</td>
+            		    <td class="list-text"  style="font-size: 85%;">{$firstpaymentamount}</td>
+            		</tr>
+            		<tr>
+            		    <td class="list-heading" style="font-size: 85%;">{$LANG.recurringamount}</td>
+            		    <td class="list-text"  style="font-size: 85%;">{$recurringamount}</td>
+            		</tr>
+            		<tr>
+            		    <td class="list-heading" style="font-size: 85%;">{$LANG.orderbillingcycle}</td>
+            		    <td class="list-text"  style="font-size: 85%;">{$billingcycle}</td>
+            		</tr>
+			<tr>
+			    <td class="list-heading" style="font-size: 85%;">{$LANG.clientareahostingnextduedate}</td>
+			    <td class="list-text"  style="font-size: 85%;">{$nextduedate}</td>
+			</tr>
+			<tr>
+			    <td class="list-heading" style="font-size: 85%;">{$LANG.orderpaymentmethod}</td>
+			    <td class="list-text"  style="font-size: 85%;">{$paymentmethod}</td>
+			</tr>
+                  {else}
+                	<tr>
+                	    <td class="list-heading" style="font-size:85%"><strong>Trial Account</strong></td>
+                            {if $status == "Beendet"}
+                              <td class="list-text" style="font-size:85%;">
+                                Abgelaufen seit {((($smarty.now - ($regdate|@strtotime)) / 86400)|round) - 14} Tagen
+                              </td>
+                            {elseif ($smarty.now - ($regdate|@strtotime)) > 1123200} {* wenn Heute - RegisterDatum > 13 Tage *}
+                              <td class="list-text" style="color:red;font-size:85%;">
+                                <span class="w-hidden">{$normalisedNextDueDate}</span>
+                                Letzter Tag der Trial Periode
+                              </td>
+                            {elseif ($smarty.now - ($regdate|@strtotime)) > 950400} {* wenn Heute - RegisterDatum > 11 Tage *}
+                              <td class="list-text" style="color:orange;font-size:85%;">
+                                <span class="w-hidden">{$normalisedNextDueDate}</span>
+                                Endet in {(14 - (($smarty.now - ($regdate|@strtotime)) / 86400)|round)} Tagen
+                              </td>
+                            {else}
+                              <td class="list-text" style="font-size:85%;">
+                                Endet in {(14 - (($smarty.now - ($regdate|@strtotime)) / 86400)|round)} Tagen
+                              </td>
+                            {/if}
+            		</tr>
+            		<tr>
+                	    <td colspan="2"><br /><br /></td>
+                	</tr>
+            		<tr>
+            		    <td></td>
+            		    <td><a href="/upgrade.php?type=package&id={$id}" class="btn btn-block btn-primary">Jetzt upgraden</a></td>
+            		</tr>
+                  {/if}
+		</table> 
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      {*
+        {if $showcancelbutton || $packagesupgrade}
+          <div class="row">
+            {if $packagesupgrade}
+              <div class="col-xs-{if $showcancelbutton}6{else}12{/if}">
+                <a href="upgrade.php?type=package&amp;id={$id}" class="btn btn-block btn-primary">{$LANG.upgrade}</a>
+              </div>
+            {/if}
+            {if $showcancelbutton}
+              <div class="col-xs-{if $packagesupgrade}6{else}12{/if}">
+                <a href="clientarea.php?action=cancel&amp;id={$id}" class="btn btn-block btn-danger {if $pendingcancellation}disabled{/if}">{if $pendingcancellation}{$LANG.cancellationrequested}{else}{$LANG.clientareacancelrequestbutton}{/if}</a>
+              </div>
+            {/if}
+          </div>
+        {/if}
+      *}
+      {if $systemStatus == 'Active'}
+        {foreach $hookOutput as $output}
+          <div class="section">
+            <div>
+              {$output}
+            </div>
+            <div class=" clearfix"></div>
+          </div>
+        {/foreach}
+        {if $domain || $moduleclientarea || $configurableoptions || $customfields || $lastupdate}
+          <div class="section">
+            <div class="card panel panel-tabs">
+              <div class="card-header">
+                <ul class="nav nav-pills card-header-pills flex-column flex-md-row">
+                  {if $domain}
+                    <li class="nav-item">
+                      <a href="#domain" data-toggle="tab" class="nav-link active"><i class="fas fa-globe fa-fw"></i> {if $type eq "server"}{lang key='sslserverinfo'}{elseif ($type eq "hostingaccount" || $type eq "reselleraccount") && $serverdata}{lang key='hostingInfo'}{else}{lang key='clientareahostingdomain'}{/if}</a>
+                    </li>
+                  {elseif $moduleclientarea}
+                    <li class="nav-item">
+                      <a href="#manage" data-toggle="tab" class="nav-link active"><i class="fas fa-globe fa-fw"></i> {lang key='manage'}</a>
+                    </li>
+                  {/if}
+                  {if $configurableoptions}
+                    <li class="nav-item">
+                      <a href="#configoptions" data-toggle="tab" class="nav-link{if !$domain && !$moduleclientarea} active{/if}"><i class="fas fa-cubes fa-fw"></i>Details</a>
+                    </li>
+                  {/if}
+                  {if $metricStats}
+                    <li class="nav-item">
+                      <a href="#metrics" data-toggle="tab" class="nav-link{if !$domain && !$moduleclientarea && !$configurableoptions} active{/if}"><i class="fas fa-chart-line fa-fw"></i> {lang key='metrics.title'}</a>
+                    </li>
+                  {/if}
+                  {if $customfields}
+                    <li class="nav-item">
+                      <a href="#additionalinfo" data-toggle="tab" class="nav-link{if !$domain && !$moduleclientarea && !$metricStats && !$configurableoptions} active{/if}"><i class="fas fa-info fa-fw"></i>Zugangsdaten</a>
+                    </li>
+                  {/if}
+                  {if $lastupdate}
+                    <li class="nav-item">
+                      <a href="#resourceusage" data-toggle="tab" class="nav-link{if !$domain && !$moduleclientarea && !$configurableoptions && !$customfields} active{/if}"><i class="fas fa-inbox fa-fw"></i> {lang key='resourceUsage'}</a>
+                    </li>
+                  {/if}
+                </ul>
+              </div>
+              <div class="card-body">
+                <div class="tab-content">
+                  {if $configurableoptions}
+                    <div class="tab-pane fade{if !$domain && !$moduleclientarea} show active{/if}" role="tabpanel" id="configoptions">
+                      <table width="100%" cellspacing="0" cellpadding="0" class="frame">
+                        <tr>
+                          <td>
+                            <table width="100%" border="0" cellpadding="10" cellspacing="0" class="table table-striped table-framed">
+                              <tr>
+                                <td align='left'>Benutzername</td>
+                                <td align="left">{$mailaddress}</td>
+                              </tr>
+                              <tr>
+                                <td align='left'>Seafile Speicher inklusive</td>
+                                <td align="left">{$basequota} GB</td>
+                              </tr>
+                              <tr>
+                                <td align='left'>Seafile Speicher zugebucht</td>
+                                <td align="left">{$addonquota} GB</td>
+                              </tr>
+                              <tr>
+                                <td align='left'>Seafile Speicher gesamt</td>
+                                <td align="left">{$userquota} GB</td>
+                              </tr>
+                              {if $moduleParams.configoption3 == 'on'}
+                              <tr>
+                                <td align='left'>Seafile Speicher</td>
+                                <td align="left">{$userquota * 2} GB</a></td>
+                              </tr>
+                              {/if}
+                            </table>
+                          </td>
+                        </tr>
+                      </table>
+                    </div>
+                  {/if}
+                  {if $metricStats}
+                    <div class="tab-pane fade{if !$domain && !$moduleclientarea && !$configurableoptions} show active{/if}" role="tabpanel" id="metrics">
+                      {include file="$template/clientareaproductusagebilling.tpl"}
+                    </div>
+                  {/if}
+                  {if $customfields}
+                    <div class="tab-pane fade{if !$domain && !$moduleclientarea && !$configurableoptions && !$metricStats} show active{/if}" role="tabpanel" id="additionalinfo">
+                      <table width="100%" cellspacing="0" cellpadding="0" class="frame">
+                        <tr>
+                          <td align='left'>Seafile URL</td>
+                          <td align="left"><a href="{$webmailurl}" target="_blank">{$webmailurl}</a></td>
+                        </tr>
+                        {if $moduleParams.configoption3 == 'on'}
+                        <tr>
+                          <td align='left'>Seafile URL</td>
+                          <td align="left"><a href="{$moduleParams.configoption4}" target="_blank">{$moduleParams.configoption4}</a></td>
+                        </tr>
+                        {/if}
+                        <tr>
+                          <td colspan=2 align='left'>
+                            <br />
+                            <hr>
+                            <br />
+                          </td>
+                        <tr>
+                          <td colspan=2 align='left'>
+                            <h6 class="heading">Integrieren Sie Seafile auf Ihr Mobiltelefon oder Ihren PC</h6>
+                          </td>
+                        </tr>
+                        <tr>
+                          <td colspan=2 align='left'>
+                            <h6 class="heading">Als Benutzernamen verwenden Sie immer Ihren Seafile Account ({$mailaddress})</h6>
+                          </td>
+                        </tr>
+                        <tr>
+                          <td colspan=2 align='left'>
+                            <br />
+                            <hr>
+                            <br />
+                          </td>
+                        </tr>
+                        <tr>
+                          <td align='center'>
+                        	<strong>Windows Drive Client</strong><br />
+                        	Zugriff auf die Daten über ein<br />
+                        	eingebundenes Netzlaufwerk.<br />
+                        	<br />
+                                <a href="https://s3.eu-central-1.amazonaws.com/download.seadrive.org/seadrive-2.0.5-en.msi" target="_blank"><img src="modules/servers/seafile/seadrive-win.png" /><a/>
+                          </td>
+                          <td align="center">
+                        	<strong>Windows Client</strong><br />
+                        	Synchronisierung Ihrer Dateien mit Seafile<br />
+                        	Mehrere Konten auf veschiedenen Servern<br />
+                        	<br />
+                                <a href="https://s3.eu-central-1.amazonaws.com/download.seadrive.org/seafile-7.0.9-en.msi" target="_blank"><img src="modules/servers/seafile/windows.png" /><a/>
+                          </td>
+                        </tr>
+                          <td colspan=2 align='left'>
+                            <br />
+                            <hr>
+                            <br />
+                          </td>
+                        </tr>
+                        <tr>
+                          <td align='center'>
+                        	<strong>Apple Drive Client</strong><br />
+                        	Zugriff auf Ihre Daten über eine im Finder
+                        	direkt eingebundene Freigabe.
+                        	Mehrere Konten auf veschiedenen Servern<br />
+                        	<br />
+                                <a href="https://s3.eu-central-1.amazonaws.com/download.seadrive.org/seadrive-2.0.5.dmg" target="_blank"><img src="modules/servers/seafile/apple.png" /><a/>
+                          </td>
+                          <td align="center">
+                                <strong>Apple Client</strong><br />
+                                Zugriff auf die Dateien via <br />
+                                Desktop Applikation<br />
+                                <br />
+                                <a href="https://s3.eu-central-1.amazonaws.com/download.seadrive.org/seafile-client-7.0.9.dmg" target="_blank"><img src="modules/servers/seafile/apple.png" /><a/>
+                          </td>
+                        </tr>
+                          <td colspan=2 align='left'>
+                            <br />
+                            <hr>
+                            <br />
+                          </td>
+                        </tr>
+                        <tr>
+                          <td align='center'>
+                        	<strong>App für Android</strong><br />
+                        	Mit dem Seafile-Client für Android<br />
+                        	können Sie Ihre Dateien über eine <br />
+                        	verschlüsselte Verbindung völlig <br />
+                        	sicher synchronisieren, bearbeiten und teilen.<br />
+                        	<br />
+                                <a href="https://play.google.com/store/apps/details?id=com.seafile.seadroid2" target="_blank"><img src="modules/servers/seafile/google_play.png" /><a/>
+                          </td>
+                          <td align="center">
+                        	<strong>App für iPhone</strong><br />
+                        	Mit dem Seafile-Client für iPhone<br />
+                        	können Sie Ihre Dateien über eine <br />
+                        	verschlüsselte Verbindung völlig <br />
+                        	sicher synchronisieren, bearbeiten und teilen.<br />
+                        	<br />
+                        	<a href="https://itunes.apple.com/cn/app/seafile-pro/id639202512?l=en&mt=8" target="_blank"><img src="modules/servers/seafile/apple_store.png" /><a/>
+                          </td>
+                        </tr>
+                      </table>
+                    </div>
+                  {/if}
+                  {if $lastupdate}
+                    <div class="tab-pane fade" role="tabpanel" id="resourceusage" align="center">
+                      <div class="col-sm-10">
+                        <div class="col-sm-6">
+                          <h4>{lang key='diskSpace'}</h4>
+                          <input type="text" value="{$diskpercent|substr:0:-1}" class="dial-usage" data-width="100" data-height="100" data-min="0" data-readOnly="true" />
+                          <p>{($diskusage / 1024)|round:1} GB / {($disklimit / 1024)|round:1} GB</p>
+                        </div>
+                      </div>
+                      <div class="clearfix">
+                      </div>
+                      <p class="text-muted">{lang key='clientarealastupdated'}: {$lastupdate}</p>
+                      <script src="{$BASE_PATH_JS}/jquery.knob.js"></script>
+                      <script>
+                        jQuery(function() {
+                          jQuery(".dial-usage").knob({
+                            'format': function(v) {
+                              alert(v);
+                            }
+                          });
+                        });
+                      </script>
+                      <div class="col-xs-{if $showcancelbutton}6{else}12{/if}">
+                        <a href="upgrade.php?type=configoptions&amp;id={$id}" class="btn btn-block btn-primary">Weiteren Speicher hinzubuchen</a>
+                      </div>
+                    </div>
+                  {/if}
+                </div>
+              </div>
+            </div>
+          </div>
+        {/if}
+        {else}
+        <div class="alert-lg no-data">
+          <div class="icon">
+            <i class="fas fa-exclamation-triangle"></i>
+          </div>
+          <div class="text">
+            {if $suspendreason}
+              <strong>{$suspendreason}</strong><br />
+            {/if}
+            {$LANG.cPanel.packageNotActive} {$status}.<br />
+            {if $systemStatus eq "Pending"}
+              {$LANG.cPanel.statusPendingNotice}
+            {elseif $systemStatus eq "Suspended"}
+              {$LANG.cPanel.statusSuspendedNotice}
+            {/if}
+          </div>
+        </div>
+      {/if}
+    {/if}
+  </div>
+  <div class="tab-pane fade in" id="tabChangepw">
+  <div class="section">
+    <div class="section-header">
+      <h3>{$LANG.serverchangepassword}</h3>
+      <p class="desc">Hier können Sie Ihr Passwort für {$mailaddress} ändern</p>
+    </div>
+    <div class="section-body">
+      <div class="row">
+        <div class="col-sm-7">
+          <form class=" using-password-strength" method="post" action="{$smarty.server.PHP_SELF}?action=productdetails&id={$id}" role="form">
+            <input type="hidden" name="id" value="{$id}" />
+            <input type="hidden" name="modulechangepassword" value="true" />
+            <div class="TM-card">
+              <div id="newPassword1" class="form-group has-feedback">
+                <label for="inputNewPassword1" class="control-label">{$LANG.newpassword}</label>
+                <input type="password" class="form-control" id="inputNewPassword1" name="newpw" autocomplete="off" />
+                <span class="form-control-feedback glyphicon"></span>
+                {include file="$template/thurdata/thurpwcheck.tpl"}
+              </div>
+              <div class="alert alert-info">
+                  <div id='hints'>
+                      <strong id='hint2Head'></strong>
+                      <div id='hintLength'></div>
+                      <div id='hintNumeric'></div>
+                      <div id='hintSymbols'></div>
+                      <div id='hintUpperLower'></div>
+                  </div>
+              </div>
+              <div id="newPassword2" class="form-group has-feedback">
+                <label for="inputNewPassword2" class="control-label">{$LANG.confirmnewpassword}</label>
+                <input type="password" class="form-control" id="inputNewPassword2" name="confirmpw" autocomplete="off" />
+                <span class="form-control-feedback glyphicon"></span>
+                <div id="inputNewPassword2Msg">
+                </div>
+              </div>
+            </div>
+            <div class="form-actions">
+              <input class="btn btn-primary" type="submit" value="{$LANG.clientareasavechanges}" />
+            </div>
+          </form>
+        </div>
+      </div>
+    </div>
+  </div>
+  </div>
+</div>

+ 23 - 0
composer.json

@@ -0,0 +1,23 @@
+{
+    "name": "Thurdata/Seafile",
+    "description": "Seafile Provisioing Module",
+    "version": "2.0.0",
+    "type": "project",
+    "license": "EULA",
+    "homepage": "http://www.thurdata.ch",
+    "support":
+            {
+                "email": "info@thurdata.ch",
+                "issues": "http://support.thurdata.ch",
+                "forum": "http://forum.thurdata.ch"
+            },
+    "authors": [
+	{
+	    "name": "Andre Genrich"
+	}
+    ],
+    "require":
+            {
+                "php": ">=7.1.0"
+            }
+}

BIN
google_play.png


+ 15 - 0
lang/arabic.php

@@ -0,0 +1,15 @@
+<?PHP
+
+$slang =  array(
+
+'stitle'	=> 'تسجيل الدخول ',
+
+'suser'		=> 'اسم المستخدم ',
+
+'sclients'  => 'تطبيق للحاسب / للمحمول',
+
+'surl'		=> 'الخادم',
+
+);
+
+?>

+ 16 - 0
lang/czech.php

@@ -0,0 +1,16 @@
+<?PHP
+
+$slang =  array(
+
+'stitle'	=> 'Server přihlášení Info ',
+
+'suser'		=> 'Uživatelské jméno',
+
+'sclients'  => 'Desktop/Mobile App:',
+
+'surl'		=> 'Server:',
+
+
+);
+
+?>

+ 16 - 0
lang/danish.php

@@ -0,0 +1,16 @@
+<?PHP
+
+$slang =  array(
+
+'stitle'	=> 'Server Log på Info ',
+
+'suser'		=> 'Brugernavn',
+
+'sclients'  => 'Desktop / Mobile App:',
+
+'surl'		=> 'Server:',
+
+
+);
+
+?>

+ 15 - 0
lang/dutch.php

@@ -0,0 +1,15 @@
+<?PHP
+
+$slang =  array(
+
+'stitle'	=> 'Server Login Info',
+
+'suser'		=> 'Username',
+
+'sclients'  => 'Desktop/Mobile App:',
+
+'surl'		=> 'Server:',
+
+);
+
+?>

+ 12 - 0
lang/english.php

@@ -0,0 +1,12 @@
+<?PHP
+
+$slang =  array(
+
+    'stitle'		=> 'Seafile Info',
+    'suser'		=> 'Username',
+    'spassword'		=> 'Reset Password',
+    'sclients'  	=> 'Desktop/Mobile App:',
+    'surl'		=> 'Server:',
+);
+
+?>

+ 15 - 0
lang/french.php

@@ -0,0 +1,15 @@
+<?PHP
+
+$slang =  array(
+
+'stitle'	=> 'Connexion au serveur Infos',
+
+'suser'		=> "UsernameNom d'utilisateur",
+
+'sclients'  => 'App de bureau / mobile:',
+
+'surl'		=> 'Serveur:',
+
+);
+
+?>

+ 11 - 0
lang/german.php

@@ -0,0 +1,11 @@
+<?PHP
+
+$slang =  array(
+    'stitle'		=> 'Seafile Info',
+    'suser'		=> 'Benutzername ',
+    'spassword'		=> 'Passwort zurücksetzen ',
+    'sclients'  	=> 'Desktop/Mobile-App:',
+    'surl'		=> 'Server:',
+);
+
+?>

+ 16 - 0
lang/italian.php

@@ -0,0 +1,16 @@
+<?PHP
+
+$slang =  array(
+
+'stitle'	=> 'Server Login Info',
+
+'suser'		=> 'nome utente',
+
+'sclients'  => 'Desktop/Mobile App:',
+
+'surl'		=> 'Server:',
+
+
+);
+
+?>

+ 15 - 0
lang/norwegian.php

@@ -0,0 +1,15 @@
+<?PHP
+
+$slang =  array(
+
+'stitle'	=> 'Server Login Info',
+
+'suser'		=> 'Brukernavn',
+
+'sclients'  => 'Desktop/Mobile App:',
+
+'surl'		=> 'Server:',
+
+);
+
+?>

+ 16 - 0
lang/portuguese-br.php

@@ -0,0 +1,16 @@
+<?PHP
+
+$slang =  array(
+
+'stitle'	=> 'Servidor Acesso Informações',
+
+'suser'		=> 'Nome de Usuário',
+
+'sclients'  => 'Desktop/Mobile App:',
+
+'surl'		=> 'Servidor:',
+
+
+);
+
+?>

+ 14 - 0
lang/portuguese-pt.php

@@ -0,0 +1,14 @@
+<?PHP
+
+$slang =  array(
+
+'stitle'	=> 'Servidor Acesso Informações',
+
+'suser'		=> 'Nome de Usuário',
+
+'sclients'  => 'Desktop/Mobile App:',
+
+'surl'		=> 'Servidor:',
+);
+
+?>

+ 16 - 0
lang/spanish.php

@@ -0,0 +1,16 @@
+<?PHP
+
+$slang =  array(
+
+'stitle'	=> 'Servidor Entrar Info',
+
+'suser'		=> 'Nombre de usuario',
+
+'sclients'  => 'Escritorio/Mobile App:',
+
+'surl'		=> 'Servidor',
+
+
+);
+
+?>

+ 15 - 0
lang/swedish.php

@@ -0,0 +1,15 @@
+<?PHP
+
+$slang =  array(
+
+'stitle'	=> 'Server Login Info',
+
+'suser'		=> 'Användarnamn ',
+
+'sclients'  => 'Desktop / app till mobilen:',
+
+'surl'		=> 'Server:',
+
+);
+
+?>

+ 16 - 0
lang/turkish.php

@@ -0,0 +1,16 @@
+<?PHP
+
+$slang =  array(
+
+'stitle'	=> 'Server Login Info',
+
+'suser'		=> 'Username',
+
+'sclients'  => 'Desktop/Mobile App:',
+
+'surl'		=> 'Server:',
+
+
+);
+
+?>

BIN
linux.png


BIN
logo.png


BIN
seadrive-win.png


+ 741 - 0
seafile.php

@@ -0,0 +1,741 @@
+<?php
+/**
+ * WHMCS Seafile Provisioning Module
+ *
+ * Provisioning for User Account on the Seafile Server
+ *
+ * @see https://www.seafile.com
+ * @copyright Copyright (c) Thurdata GmbH 2020
+ * @license GPL
+ */
+use WHMCS\Database\Capsule;
+
+require_once(__DIR__ . '/api/Sf/Admin.php');
+if (!defined('WHMCS')) {
+	die('This file cannot be accessed directly'); }
+
+
+function seafile_MetaData() {
+    return array(
+            'DisplayName' => 'Seafile Provisioning',
+            'APIVersion' => '1.2',
+            'DefaultNonSSLPort' => '8000',
+            'DefaultSSLPort' => '443',
+            'RequiresServer' => true,
+            'ServiceSingleSignOnLabel' => 'Login to Seafile',
+            'AdminSingleSignOnLabel' => 'Login to Seafile Admin',
+            'ListAccountsUniqueIdentifierDisplayName' => 'Domain',
+            'ListAccountsUniqueIdentifierField' => 'domain',
+            'ListAccountsProductField' => 'configoption1',
+    );
+}
+
+/**
+ * Define SeaFile product configuration options. 
+ *
+ * @see https://developers.whmcs.com/provisioning-modules/config-options/
+ *
+ * @return array
+ */
+function seafile_ConfigOptions() {
+	$configarray = array(	 
+	    'quota' => array(
+			'Type' => 'text',
+			'Description' => 'Basis  User-Quota für dieses Produkt in GB',
+			'Default' => '10',
+			'Size' => '15',
+			'FriendlyName' => 'User Quota',
+		),
+	);
+	return $configarray;
+}
+
+/**
+ * Test connection to a SeaFile server with the given server parameters.
+ *
+ * Allows an admin user to verify that an API connection can be
+ * successfully made with the given configuration parameters for a
+ * server.
+ *
+ * When defined in a module, a Test Connection button will appear
+ * alongside the Server Type dropdown when adding or editing an
+ * existing server.
+ *
+ * @param array $params common module parameters
+ *
+ * @see https://developers.whmcs.com/provisioning-modules/module-parameters/
+ *
+ * @return array
+ */
+function seafile_TestConnection($params) {
+	$seafileURL = $params['serverhttpprefix'] . '://' . $params['serverhostname'] . ':' . $params['serverport'];
+	error_log("Seafile:TestConnection: " . $seafileURL);
+	//error_log("  -> " . $params['serverusername'] . "     " . $params['serverpassword']);
+	$seafileAPI = new Sf_Admin($seafileURL,$params['serverusername'],$params['serverpassword']);
+	$response = $seafileAPI->login();
+	if (isset($response['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not login to ' . $seafileURL,
+			$response
+		);
+		return array(
+			'success' => false,
+			'error' => 'Error: could not login to ' . $seafileURL,
+		);
+	}
+	return array(
+		'success' => true,
+		'error' => '',
+	);
+}
+
+/**
+ * Usage Update
+ * 
+ * Important: Runs daily per server not per product
+ * Run Manually: /admin/reports.php?report=disk_usage_summary&action=updatestats
+ * @param array $params common module parameters
+ * 
+ * @see https://developers.whmcs.com/provisioning-modules/usage-update/
+ */
+function seafile_UsageUpdate($params) {
+	$seafileURL = $params['serverhttpprefix'] . '://' . $params['serverhostname'] . ':' . $params['serverport'];
+	$seafileAPI = new Sf_Admin($seafileURL,$params['serverusername'],$params['serverpassword']);
+	$response = $seafileAPI->login();
+	if (isset($response['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not login to ' . $seafileURL,
+			$response
+		);
+	    return 'Error: could not login to ' . $seafileURL;
+	}
+    $servicesObj = Capsule::table('tblhosting')
+        ->select('*')
+        ->where('server', '=', $params['serverid'])
+        ->where('domainstatus', '=', 'Active')
+        ->get();
+    foreach((array)$servicesObj as $serviceObj) {
+		$service = get_object_vars($serviceObj[0]);
+		$accountInfo = $seafileAPI->getAccount($service['username']);
+		error_log("Seafile Module: Updating Disk Usage for: " . $accountInfo . " : " . round($accountInfo['quota_usage'] / 1000000,2) . "/" . round($accountInfo['quota_total'] / 1000000,2));
+		if(!isset($accountInfo['error_msg'])) {
+			try {
+				Capsule::table('tblhosting')
+					->where('id', '=', $service['id'])
+					->update(
+						array(
+							'diskusage' => round($accountInfo['quota_usage'] / 1000000,2),
+							'disklimit' => round($accountInfo['quota_total'] / 1000000,2),
+							'lastupdate' => Capsule::raw('now()')
+						)
+					);
+			} catch (Exception $e) {
+				logModuleCall(
+					'seafile',
+					__FUNCTION__,
+					$params,
+					'Error: could update usage information for ' . $service['username'],
+					$e->getMessage()
+				);
+			}
+		}
+    }
+}
+
+/**
+ * Client area output logic handling.
+ *
+ * This function is used to define module specific client area output. It should
+ * return an array consisting of a template file and optional additional
+ * template variables to make available to that template.
+ *
+ * The template file you return can be one of two types:
+ *
+ * * tabOverviewModuleOutputTemplate - The output of the template provided here
+ *   will be displayed as part of the default product/service client area
+ *   product overview page.
+ *
+ * * tabOverviewReplacementTemplate - Alternatively using this option allows you
+ *   to entirely take control of the product/service overview page within the
+ *   client area.
+ *
+ * Whichever option you choose, extra template variables are defined in the same
+ * way. This demonstrates the use of the full replacement.
+ *
+ * Please Note: Using tabOverviewReplacementTemplate means you should display
+ * the standard information such as pricing and billing details in your custom
+ * template or they will not be visible to the end user.
+ *
+ * @param array $params common module parameters
+ *
+ * @see https://developers.whmcs.com/provisioning-modules/module-parameters/
+ *
+ * @return array
+ */
+function seafile_ClientArea($params) {
+	switch ($params['serverport']) {
+		case '80':
+		case '443':
+			$seafileURL = $params['serverhttpprefix'] . '://' . $params['serverhostname'];
+			break;
+		default:
+			$seafileURL = $params['serverhttpprefix'] . '://' . $params['serverhostname'] . ':' . $params['serverport'];
+			break;
+	};
+        $clientInfo['basequota']        = $params['configoption1'] ? $params['configoption1'] : 1;
+        $clientInfo['addonquota']       = $params['configoptions']['addonQuota'] ? $params['configoptions']['addonQuota'] : 0;
+        $clientInfo['userquota']        = $clientInfo['basequota'] + $clientInfo['addonquota'];
+        $clientInfo['mailaddress']      = $params['username'];
+        $clientInfo['webmailurl']       = $seafileURL;
+        $clientInfo['zimbraserver']     = parse_url($clientInfo['webmailurl'], PHP_URL_HOST);
+        $clientinfo['url']              = $seafileURL;
+        $clientinfo['user']             = $user;
+        $clientinfo['mobile1']          = $app;
+        $clientinfo['mobile2']          = $google;
+        $clientinfo['winclient']        = $winClient;
+        $clientinfo['macclient']        = $macClient;
+        $clientinfo['linClient']        = $linClient;
+        $clientinfo['stitle']           = $params['model']['product']['name'];
+
+
+        return array(
+            'tabOverviewReplacementTemplate' => 'clientarea',
+            'vars' => $clientInfo,
+        );
+}
+
+/**
+ * Change the password for a SeaFile account.
+ *
+ * Called when a password change is requested. This can occur either due to a
+ * client requesting it via the client area or an admin requesting it from the
+ * admin side.
+ *
+ * This option is only available to client end users when the product is in an
+ * active status.
+ *
+ * @param array $params common module parameters
+ *
+ * @see https://developers.whmcs.com/provisioning-modules/module-parameters/
+ *
+ * @return string 'success' or an error message
+ */
+function seafile_ChangePassword($params) { 
+	$checkPassword = seafileCheckPassword($params['password']);
+	if ($checkPassword != null) {
+	    return $checkPassword;
+	}
+	$seafileURL = $params['serverhttpprefix'] . '://' . $params['serverhostname'] . ':' . $params['serverport'];
+	$seafileAPI = new Sf_Admin($seafileURL,$params['serverusername'],$params['serverpassword']);
+	$response = $seafileAPI->login();
+	if (isset($response['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not login to ' . $seafileURL,
+			$response
+		);
+	    return 'Error: could not login to ' . $seafileURL;
+	}
+	$userAccount = $seafileAPI->getAccount($params['username']);
+	if(isset($userAccount['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not find account for: ' . $params['username'],
+			$userAccount
+		);
+		return 'Error: could not find account for: ' . $params['username'];
+	}
+	$result = $seafileAPI->modifyAccount(array('email' => $userAccount['email'], 'password' => $params['password']));
+	if(isset($result['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not change password for: ' . $params['username'],
+			$result
+		);
+		return 'Error: could not change password for: ' . $params['username'];
+	}
+	return 'success';
+}
+
+/**
+ * Set a new quota of a SeaFile account.
+ *
+ * Called to apply a quota change of the service. It
+ * is called to provision upgrade or downgrade orders, as well as being
+ * able to be invoked manually by an admin user.
+ *
+ * This same function is called for upgrades and downgrades of both
+ * products and configurable options.
+ *
+ * @param array $params common module parameters
+ *
+ * @see https://developers.whmcs.com/provisioning-modules/module-parameters/
+ *
+ * @return string 'success' or an error message
+ */
+function seafile_ChangePackage($params) { 
+	$quota		= $params['configoption1'] ? $params['configoption1'] : 1;
+	$addonQuota 	= $params['configoptions']['addonQuota'] ? $params['configoptions']['addonQuota'] : 0;
+        $newAddQuota	= $params['configoptions']['newAddQuota'] ? $params['configoptions']['newAddQuota'] : 0;
+		
+	$accountQuota = ($quota + $addonQuota + $newAddQuota);
+	$seafileURL = $params['serverhttpprefix'] . '://' . $params['serverhostname'] . ':' . $params['serverport'];
+	$seafileAPI = new Sf_Admin($seafileURL,$params['serverusername'],$params['serverpassword']);
+	$response = $seafileAPI->login();
+	if (isset($response['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not login to ' . $seafileURL,
+			$response
+		);
+	    return 'Error: could not login to ' . $seafileURL;
+	}
+	$userAccount = $seafileAPI->getAccount($params['username']);
+	if(isset($userAccount['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not find account ' . $params['username'],
+			$userAccount
+		);
+		return 'Error: could not find account ' . $params['username'];
+	}
+	$result = $seafileAPI->modifyAccount(array('email' => $userAccount['email'], 'quota_total' => $accountQuota * 1024));
+	if(isset($result['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not update quota for ' . $userAccount['email'],
+			$result
+		);
+		return 'Error: could not update quota for ' . $userAccount['email'];
+	} elseif ($result['quota_total'] != ($accountQuota * 1048576)) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: quota for ' . $userAccount['email'] . ' not updated',
+			$result
+		);
+		return 'Error: quota for ' . $userAccount['email'] . ' not updated';
+	}
+    try {
+        Capsule::table('tblhosting')
+            ->where('id', '=', $params['serviceid'])
+            ->update(
+                array(
+                    'disklimit' => $userAccount['quota_total'] / 1024,
+                )
+            );
+    } catch (Exception $e) {
+        logModuleCall(
+            'seafile',
+            __FUNCTION__,
+            $params,
+            'Error: could not update quota in database',
+            $e->getMessage()
+        );
+        return 'Error: could not update quota in database';
+    }
+    if(seafileUpdateQuota($params) != 'success') {
+        return 'Error: could not update addonQuota in database';
+    };
+    return 'success';
+}
+
+/**
+ * Provision a new instance of a SeaFile account.
+ *
+ * Attempt to provision a new SeaFile account. This is
+ * called any time provisioning is requested inside of WHMCS. Depending upon the
+ * configuration, this can be any of:
+ * * When a new order is placed
+ * * When an invoice for a new order is paid
+ * * Upon manual request by an admin user
+ *
+ * @param array $params common module parameters
+ *
+ * @see https://developers.whmcs.com/provisioning-modules/module-parameters/
+ *
+ * @return string 'success' or an error message
+ */
+function seafile_CreateAccount($params) {
+	$firstName     = $params['customfields']['firstname'];
+	$lastName      = $params['customfields']['lastname'];
+	$loginEMail    = $params['customfields']['login'];
+        $loginPassword = $params['customfields']['password'];
+	$baseQuota     = $params['configoption1'];
+	$addonQuota    = $params['configoptions']['addonQuota'] ? $params['configoptions']['addonQuota'] : 0;
+	$newAddQuota   = $params['configoptions']['newAddQuota'] ? $params['configoptions']['newAddQuota'] : 0;
+	
+	//error_log( print_r($params,true)  );
+	
+	$seafileURL = $params['serverhttpprefix'] . '://' . $params['serverhostname'] . ':' . $params['serverport'];
+	$seafileAPI = new Sf_Admin($seafileURL,$params['serverusername'],$params['serverpassword']);
+	$response = $seafileAPI->login();
+	if (isset($response['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not login to ' . $seafileURL,
+			$response
+		);
+	    return 'Error: could not login to ' . $seafileURL;
+	}
+	$existingAccount = $seafileAPI->getAccount($loginEMail);
+	if(!isset($existingAccount['error_msg'])) {
+		return 'Error: account already exists ' . $loginEMail;
+	}
+	$accountQuota = ($baseQuota + $addonQuota + $newAddQuota) * 1024;
+	$newAccount = array();
+	$newAccount['email'] = $loginEMail;
+	$newAccount['name'] = $firstName . ' ' . $lastName;
+	$newAccount['isActive'] = 1;
+	$newAccount['isStaff'] = 0;
+	$newAccount['password'] = $loginPassword;
+	$newAccount['note'] = 'Account created from WHCMS for client ' . $params['userid'];
+	$newAccount['quota_total'] = $accountQuota;
+	error_log("Seafile:Create Account for " . $loginEMail . " with " . $accountQuota . "MB");
+	$result = $seafileAPI->createAccount($newAccount);
+	if(isset($result['error_msg'])) {
+	    logModuleCall(
+        	'seafile',
+        	__FUNCTION__,
+        	$params,
+    		'Error: could not create account ' . $loginEMail,
+    		$result
+		);
+	    return 'Error: could not create account ' . $loginEMail;
+	}
+	try {
+    	    Capsule::table('tblhosting')
+        	->where('id', '=', $params['serviceid'])
+        	->update(
+            	    array(
+                	'username'  => $loginEMail,
+                	'password'  => $params['customfields']['password'],
+                	'disklimit' => $accountQuota,
+                	'diskusage' => 0,
+            	    )
+        	);
+	} catch (\Exception $e) {
+    	    logModuleCall(
+        	'seafile',
+        	__FUNCTION__,
+        	$params,
+        	'Error: could save username & password in database',
+        	$e->getMessage()
+    	    );
+    	    return 'Error: could save username & password in database';
+	}
+	if(seafileUpdateQuota($params) != 'success') {
+    	    return 'Error: could not update addonQuota in database';
+	};
+	return 'success';
+}
+
+/**
+ * Set a SeaFile account to status inactive.
+ *
+ * Called when a suspension is requested. This is invoked automatically by WHMCS
+ * when a product becomes overdue on payment or can be called manually by admin
+ * user.
+ *
+ * @param array $params common module parameters
+ *
+ * @see https://developers.whmcs.com/provisioning-modules/module-parameters/
+ *
+ * @return string 'success' or an error message
+ */
+function seafile_SuspendAccount($params) {
+	$seafileURL = $params['serverhttpprefix'] . '://' . $params['serverhostname'] . ':' . $params['serverport'];
+	$seafileAPI = new Sf_Admin($seafileURL,$params['serverusername'],$params['serverpassword']);
+	$response = $seafileAPI->login();
+	if (isset($response['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not login to ' . $seafileURL,
+			$response
+		);
+	    return 'Error: could not login to ' . $seafileURL;
+	}
+	$userAccount = $seafileAPI->getAccount($params['username']);
+	if(isset($userAccount['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not find account ' . $params['username'],
+			$userAccount
+		);
+		return 'Error: could not find account ' . $params['username'];
+	}
+	$result = $seafileAPI->modifyAccount(array('email' => $userAccount['email'], 'is_active' => 0));
+	if(isset($result['error_msg'])) {
+	    logModuleCall(
+    		'seafile',
+    		__FUNCTION__,
+    		$params,
+    		'Error: could not suspend ' . $params['username'],    	    
+    		$result
+    	);
+	    return 'Error: could not suspend ' . $params['username'];
+	} elseif ($result['update_status_tip'] != 'Edit succeeded') {
+	    logModuleCall(
+    		'seafile',
+    		__FUNCTION__,
+    		$params,
+    		'Error: ' . $params['username'] . ' not deactivated',    	    
+    		$result
+    	);
+	    return 'Error: ' . $params['username'] . ' not deactivated';
+	}
+	return 'success';
+}
+
+/**
+ * Set a SeaFile account to status active.
+ *
+ * Called when an un-suspension is requested. This is invoked
+ * automatically upon payment of an overdue invoice for a product, or
+ * can be called manually by admin user.
+ *
+ * @param array $params common module parameters
+ *
+ * @see https://developers.whmcs.com/provisioning-modules/module-parameters/
+ *
+ * @return string 'success' or an error message
+ */
+function seafile_UnsuspendAccount($params) {
+	$seafileURL = $params['serverhttpprefix'] . '://' . $params['serverhostname'] . ':' . $params['serverport'];
+	$seafileAPI = new Sf_Admin($seafileURL,$params['serverusername'],$params['serverpassword']);
+	$response = $seafileAPI->login();
+	if (isset($response['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not login to ' . $seafileURL,
+			$response
+		);
+	    return 'Error: could not login to ' . $seafileURL;
+	}
+	$userAccount = $seafileAPI->getAccount($params['username']);
+	if(isset($userAccount['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not find account ' . $params['username'],
+			$userAccount
+		);
+		return 'Error: could not find account ' . $params['username'];
+	}
+	$result = $seafileAPI->modifyAccount(array('email' => $userAccount['email'], 'is_active' => 1));
+	if(isset($result['error_msg'])) {
+	    logModuleCall(
+    		'seafile',
+    		__FUNCTION__,
+    		$params,
+    		'Error: could not suspend ' . $params['username'],    	    
+    		$result
+    	);
+	    return 'Error: could not suspend ' . $params['username'];
+	} elseif ($result['update_status_tip'] != 'Edit succeeded') {
+	    logModuleCall(
+    		'seafile',
+    		__FUNCTION__,
+    		$params,
+    		'Error: ' . $params['username'] . ' not activated',    	    
+    		$result
+    	);
+	    return 'Error: ' . $params['username'] . ' not activated';
+	}
+	return 'success';
+}
+
+
+/**
+ * Removes a SeaFile account.
+ *
+ * Called when a termination is requested. This can be invoked automatically for
+ * overdue products if enabled, or requested manually by an admin user.
+ *
+ * @param array $params common module parameters
+ *
+ * @see https://developers.whmcs.com/provisioning-modules/module-parameters/
+ *
+ * @return string 'success' or an error message
+ */
+function seafile_TerminateAccount($params) {
+	$seafileURL = $params['serverhttpprefix'] . '://' . $params['serverhostname'] . ':' . $params['serverport'];
+	$seafileAPI = new Sf_Admin($seafileURL,$params['serverusername'],$params['serverpassword']);
+	$response = $seafileAPI->login();
+	if (isset($response['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not login to ' . $seafileURL,
+			$response
+		);
+	    return 'Error: could not login to ' . $seafileURL;
+	}
+	$existingAccount = $seafileAPI->getAccount($params['username']);
+	if(isset($existingAccount['error_msg'])) {
+		logModuleCall(
+			'seafile',
+			__FUNCTION__,
+			$params,
+			'Error: could not find account ' . $params['username'],
+			''
+		);
+		return 'Error: could not find account ' . $params['username'];
+	}
+	//if ($existingAccount['is_active'] == 1) {
+	//	return 'Account '. $params['username'] . ' is active, suspend account first!';
+	//}
+	$result = $seafileAPI->deleteAccount($params['username']);
+	if($result != true) {
+	    logModuleCall(
+    		'seafile',
+    		__FUNCTION__,
+    		$params,
+    		'Error: could not remove ' . $params['username'],    	    
+    		$seafileAPI
+    	    );
+	    return 'Error: could not remove ' . $params['username'];
+	}
+	return 'success';
+}
+
+/**
+ * server side password check
+ * 
+ * recheck the client side password check
+ * in case that the client side check has been disabled
+ * 
+ * @param string $pwd password
+ * 
+ * @return string missing features or null if the password matches our needs
+ */
+function seafileCheckPassword($pwd) {
+    if (strlen($pwd) < 8) {
+        return 'Das das Passwort ist zu kurz. Es werden mind. 8 Zeichen benötigt';
+    }
+
+    if (!preg_match('#[0-9]+#', $pwd)) {
+        return 'Das Passwort muss mindestens eine Zahl enthalten';
+    }
+
+    if (!preg_match('#[A-Z]+#', $pwd)) {
+        return 'Das Passwort muss mindestens einen Grossbuchstaben (A-Z) enthalten';
+    }     
+
+    if (!preg_match('#[a-z]+#', $pwd)) {
+        return 'Das Passwort muss mindestens einen Kleinbuchstaben (a-z) enthalten';
+    }     
+
+    if (!preg_match('#[^\w]+#', $pwd)) {
+        return 'Das Passwort muss mindestens ein Sonderzeichen (.,-:=) enthalten';
+    }
+    return null;
+}
+
+/**
+ * Perform an update of customfields to prevent downgrades.
+ *
+ * Called in changePackage or createAccount functions.
+ *
+ * @param array $params common module parameters
+ *
+ * @return *success* or an error
+ */
+function seafileUpdateQuota($params) {
+    if(isset($params['configoptions']['addonQuota'])) {
+        $addonQuota = $params['configoptions']['addonQuota'] ? $params['configoptions']['addonQuota'] : 0 ;
+        $newAddQuota = $params['configoptions']['newAddQuota'] ? $params['configoptions']['newAddQuota'] : 0;
+        $addonQuota = $addonQuota + $newAddQuota;
+        $addonQuotaFieldIDObj = Capsule::table('tblproductconfigoptions')
+            ->join('tblhostingconfigoptions', 'tblproductconfigoptions.id', '=', 'tblhostingconfigoptions.configid')
+            ->where('tblhostingconfigoptions.relid', '=', $params['serviceid'])
+            ->where('tblproductconfigoptions.optionname', 'like', 'addonQuota%')
+            ->select('tblhostingconfigoptions.id', 'tblproductconfigoptions.qtymaximum')
+            ->get();
+        if($addonQuota > $addonQuotaFieldIDObj[0]->qtymaximum) {
+            logModuleCall(
+                'seafile',
+                __FUNCTION__,
+                $params,
+                'Info: someone is trying to exceed the maximum size',
+                ''
+            );
+            $addonQuota = $addonQuotaFieldIDObj[0]->qtymaximum;
+        }
+        try {
+            $updateAddonQuota = Capsule::table('tblhostingconfigoptions')
+                ->where('id', $addonQuotaFieldIDObj[0]->id)
+                ->update(
+                    [
+                        'qty' => $addonQuota,
+                    ]
+                );
+        } catch (\Exception $e) {
+            logModuleCall(
+                'seafile',
+                __FUNCTION__,
+                $updateAddonQuota,
+                'Error: could not save addonOuota in database.',
+                $e->getMessage()
+            );
+            return 'Error: could not save addonOuota in database.';
+        }
+        $newAddQuotaFieldIDObj = Capsule::table('tblproductconfigoptions')
+            ->join('tblhostingconfigoptions', 'tblproductconfigoptions.id', '=', 'tblhostingconfigoptions.configid')
+            ->where('tblhostingconfigoptions.relid', '=', $params['serviceid'])
+            ->where('tblproductconfigoptions.optionname', 'like', 'newAddQuota%')
+            ->select('tblhostingconfigoptions.id')
+            ->get();
+        try {
+            $updateNewAddQuota = Capsule::table('tblhostingconfigoptions')
+                ->where('id', $newAddQuotaFieldIDObj[0]->id)
+                ->update(
+                    [
+                        'qty' => '0',
+                    ]
+                );
+        } catch (\Exception $e) {
+            logModuleCall(
+                'seafile',
+                __FUNCTION__,
+                $updateNewAddQuota,
+                'Error: could not reset newAddOuota in database.',
+                $e->getMessage()
+            );
+            return 'Error: could not reset newAddOuota in database.';
+        }
+    }
+    return 'success';
+}
+
+
+?>

+ 83 - 0
seafileAddressAvailable.php

@@ -0,0 +1,83 @@
+<?php
+/**
+ * Helper script to check the availibility of a Seafile Account useable with ajax requests
+ * 
+ * @see https://www.seafile.com
+ * @copyright Copyright (c) Thurdata GmbH 2021
+ * @license GPL
+ * 
+ */
+$pos = strpos($_SERVER['HTTP_REFERER'],getenv('HTTP_HOST'));
+if($pos===false) {
+    die('Restricted access');
+}
+$productID = $_GET['pid'];
+$accountName = $_GET['username'];
+if(!filter_var($accountName, FILTER_VALIDATE_EMAIL)) {
+    echo "invalid";
+    exit;
+}
+
+error_log("Seafile Address Available: ". $productID . "/" . $accountName);
+/**
+ * Requires the whmcs init
+ * Requires this PHP api to make soap calls and parse responses
+ */
+require_once(__DIR__ . '/../../../init.php');
+require_once(__DIR__ . '/api/Sf/Admin.php');
+use WHMCS\Database\Capsule;
+$whmcs = App::self();
+$accessData = array('seafileURL' => '', 'adminUser' => '', 'adminPass' => '');
+$serverGroupIDObj = Capsule::table('tblproducts')
+	->select('servergroup')
+	->where('id', '=', $productID)
+	->get();
+$serverGroupID = $serverGroupIDObj[0]->servergroup;
+$serverIDObj = Capsule::table('tblservergroupsrel')
+    ->select('serverid')
+    ->where('groupid', '=', $serverGroupID)
+    ->get();
+$serverID = $serverIDObj[0]->serverid;
+$server = Capsule::table('tblservers')
+	->select('hostname', 'secure', 'port', 'username', 'password')
+	->where('id', '=', $serverID)
+	->where('active', '=', 1)
+	->get();
+
+$accessData['seafileServer'] = $server[0]->hostname;
+$accessData['prefix'] = $server[0]->secure ? 'https://' : 'http://';
+$accessData['port'] = $server[0]->port;
+$accessData['adminUser'] = $server[0]->username;
+$adminPassCrypt = $server[0]->password;
+$adminPassDecrypt = localAPI('DecryptPassword', array('password2' => $adminPassCrypt));
+if ($adminPassDecrypt['result'] == 'success') {
+        $accessData['adminPass'] = $adminPassDecrypt['password'];
+}
+
+if (empty($accessData['port']) || $accessData['port'] == "") {
+    $seafileURL = $accessData['prefix'] . $accessData['seafileServer'] . ":443";
+} else {
+    $seafileURL = $accessData['prefix'] . $accessData['seafileServer'] . ':' . $accessData['port'];
+}
+$seafileAPI = new Sf_Admin($seafileURL,$accessData['adminUser'],$accessData['adminPass']);
+$response = $seafileAPI->login();
+
+if (isset($response['error_msg'])) {
+    logModuleCall(
+        'seafile',
+        __FUNCTION__,
+        $params,
+        'Error: could not login to ' . $seafileURL,
+        $response
+    );
+    error_log("  --> ERROR " . print_r($response,true));
+    echo "error";
+    exit();
+} else {
+    $existingAccount = $seafileAPI->getAccount($accountName);
+    if (isset($existingAccount['error_msg'])) {
+        echo 'yes';
+    } else {
+        echo 'no';
+    }
+}

+ 28 - 0
whmcs.json

@@ -0,0 +1,28 @@
+{
+  "schema": "1.0",
+  "type": "whmcs-provisioning",
+  "name": "seafile",
+  "license": "GPL",
+  "category": "provisioning",
+  "description": {
+    "name": "Seafile",
+    "tagline": "Seafile Provisioning Module for WHMCS.",
+    "short": "Seafile users can be easily provoked with this module. The customer can also reset his Seafile password.",
+    "long": "The module allows single-user provisioning of Seafile accounts. It implements a simple seafile hosting for private customers with only one account each. The hosting of corporate environments was deliberately omitted, because they get their own instance (VM) for their seafile data."
+  },
+  "logo": {
+    "filename": "logo.png"
+  },
+  "support": {
+    "homepage": "https://www.thurdata.ch/whmcs",
+    "learn_more": "https://www.thurdata.ch/whmcs/#features",
+    "support_url": "https://www.thurdata.ch/support",
+    "docs_url": "https://www.thudata.ch/whmcs/docs"
+  },
+  "authors": [
+    {
+      "name": "Thurdata GmbH",
+      "homepage": "https://www.thurdata.ch/"
+    }
+  ]
+}

BIN
windows.png