├── .FemanagerFeaturesList.md ├── .crowdin.yml ├── .ddev ├── commands │ ├── host │ │ └── initialize │ └── web │ │ ├── build-assets │ │ ├── phive-update │ │ ├── qa │ │ └── typo3 ├── config.yaml ├── docker-compose.browser.yaml ├── traefik │ ├── certs │ │ ├── femanager.crt │ │ └── femanager.key │ └── config │ │ └── femanager.yaml └── typo3 │ ├── additional.php │ ├── config.yaml │ └── settings.php ├── .github └── workflows │ ├── terupload.yaml │ ├── test-documentation.yml │ └── testing.yaml ├── Classes ├── Controller │ ├── AbstractController.php │ ├── AbstractFrontendController.php │ ├── DataController.php │ ├── EditController.php │ ├── HasConfirmationByFormSubmitTrait.php │ ├── InvitationController.php │ ├── NewController.php │ ├── UserBackendController.php │ └── UserController.php ├── DataProcessor │ ├── AbstractDataProcessor.php │ ├── DataProcessorInterface.php │ ├── DataProcessorRunner.php │ └── DateConverter.php ├── DataProvider │ ├── CountryDataProvider.php │ └── CountryZonesDataProvider.php ├── DependencyInjection │ └── CompilerPass │ │ └── ChangeClassDatamapPass.php ├── Domain │ ├── Model │ │ ├── Log.php │ │ ├── User.php │ │ └── UserGroup.php │ ├── Repository │ │ ├── LogRepository.php │ │ ├── PluginRepository.php │ │ ├── UserGroupRepository.php │ │ └── UserRepository.php │ ├── Service │ │ ├── AutoAdminConfirmation │ │ │ ├── AbstractConfirmation.php │ │ │ ├── ConfirmationInterface.php │ │ │ └── EmailDomainConfirmation.php │ │ ├── AutoAdminConfirmationService.php │ │ ├── FileService.php │ │ ├── FinisherService.php │ │ ├── PageTreeService.php │ │ ├── PluginService.php │ │ ├── RatelimiterService.php │ │ ├── SendMailService.php │ │ ├── SendParametersService.php │ │ ├── StoreInDatabaseService.php │ │ └── ValidationSettingsService.php │ └── Validator │ │ ├── AbstractValidator.php │ │ ├── CaptchaValidator.php │ │ ├── ClientsideValidator.php │ │ ├── PasswordValidator.php │ │ ├── ServersideValidator.php │ │ ├── ShouldValidateStateCondition.php │ │ └── ValidationConditionInterface.php ├── Event │ ├── AdminConfirmationUserEvent.php │ ├── AfterMailSendEvent.php │ ├── AfterUserUpdateEvent.php │ ├── BeforeMailBodyRenderEvent.php │ ├── BeforeMailSendEvent.php │ ├── BeforeUpdateUserEvent.php │ ├── BeforeUserConfirmEvent.php │ ├── BeforeUserCreateEvent.php │ ├── CreateConfirmationRequestEvent.php │ ├── DeleteUserEvent.php │ ├── FinalCreateEvent.php │ ├── FinalUpdateEvent.php │ ├── ImpersonateEvent.php │ ├── InviteUserConfirmedEvent.php │ ├── InviteUserCreateEvent.php │ ├── InviteUserEditEvent.php │ ├── InviteUserUpdateEvent.php │ ├── RefuseUserEvent.php │ ├── UniqueUserEvent.php │ ├── UserLogEvent.php │ └── UserWasConfirmedByAdminEvent.php ├── Exception │ ├── FileNotFoundException.php │ └── NotPaginatableException.php ├── Finisher │ ├── AbstractFinisher.php │ ├── FinisherInterface.php │ ├── FinisherRunner.php │ ├── SaveToAnyTableFinisher.php │ └── SendParametersFinisher.php ├── Middleware │ ├── CleanUserGroupMiddleware.php │ └── RemovePasswordIfEmptyMiddleware.php ├── Persistence │ └── Generic │ │ └── Mapper │ │ └── DataMap.php ├── Updates │ └── PluginUpdater.php ├── UserFunc │ ├── StaticInfoTables.php │ ├── UserFieldsOptions.php │ └── UserOptions.php ├── Utility │ ├── AbstractUtility.php │ ├── BackendUserUtility.php │ ├── BackendUtility.php │ ├── ConfigurationUtility.php │ ├── FileUtility.php │ ├── FrontendUtility.php │ ├── HashUtility.php │ ├── LocalizationUtility.php │ ├── LogUtility.php │ ├── ObjectUtility.php │ ├── StringUtility.php │ ├── TemplateUtility.php │ └── UserUtility.php └── ViewHelpers │ ├── Be │ ├── GetClassNameOnActionViewHelper.php │ ├── IsConfirmationModuleActivatedViewHelper.php │ └── IsResendUserConfirmationRequestActivatedViewHelper.php │ ├── Condition │ └── IsBackendAdministratorAuthenticationViewHelper.php │ ├── Form │ ├── GetCountriesFromStaticInfoTablesViewHelper.php │ ├── GetCountriesViewHelper.php │ ├── SelectViewHelper.php │ └── TextfieldViewHelper.php │ ├── Misc │ ├── BackendEditLinkViewHelper.php │ ├── BackendNewLinkViewHelper.php │ ├── CaptchaEnabledViewHelper.php │ ├── ExplodeViewHelper.php │ ├── GetFirstViewHelper.php │ ├── RequestViewHelper.php │ └── UpperViewHelper.php │ ├── Pagination │ ├── PaginateViewHelper.php │ └── UriViewHelper.php │ ├── Repository │ └── GetFirstViewHelper.php │ └── Validation │ ├── AbstractValidationViewHelper.php │ ├── FormValidationDataViewHelper.php │ └── IsRequiredFieldViewHelper.php ├── Configuration ├── Backend │ └── Modules.php ├── Extbase │ └── Persistence │ │ └── Classes.php ├── FlexForms │ ├── FlexFormDetail.xml │ ├── FlexFormEdit.xml │ ├── FlexFormInvitation.xml │ ├── FlexFormList.xml │ └── FlexFormRegistration.xml ├── Icons.php ├── RequestMiddlewares.php ├── Services.php ├── Services.yaml ├── TCA │ ├── Overrides │ │ ├── fe_users.php │ │ ├── sys_template.php │ │ └── tt_content.php │ └── tx_femanager_domain_model_log.php ├── TSConfig │ └── ContentElementWizard.typoscript ├── TypoScript │ ├── Layout │ │ └── setup.typoscript │ └── Main │ │ ├── constants.typoscript │ │ └── setup.typoscript ├── UserTsConfig │ └── BackendModule.typoscript └── page.tsconfig ├── Documentation ├── Changelog │ └── Index.rst ├── FAQ │ └── Index.rst ├── Features │ ├── AutoConfirmation │ │ └── Index.rst │ ├── ConfirmUserConfirmationRefused │ │ └── Index.rst │ ├── Countryselect │ │ └── Index.rst │ ├── Events │ │ └── Index.rst │ ├── FillEmailAsUsername │ │ └── Index.rst │ ├── Finishers │ │ └── Index.rst │ ├── Index.rst │ ├── NewFields │ │ └── Index.rst │ ├── NewValidators │ │ └── Index.rst │ ├── RateLimiter │ │ └── Index.rst │ ├── ResendUserConfirmationRequest │ │ └── Index.rst │ ├── ShowListUsers │ │ └── Index.rst │ └── Templates │ │ └── Index.rst ├── Images │ ├── feature-showlistusers-loggedin-user.png │ ├── feature-showlistusers-loggedin-user1.png │ ├── feature-showlistusers-loggedin-user2.png │ ├── femanager_backend1.png │ ├── femanager_backend2.png │ ├── femanager_backend3.png │ ├── femanager_backend4.png │ ├── femanager_backendmodule.png │ ├── femanager_backendmodule2.png │ ├── femanager_constants.png │ ├── femanager_create1.png │ ├── femanager_create2.png │ ├── femanager_create3.png │ ├── femanager_edit1.png │ ├── femanager_edit2.png │ ├── femanager_extensionmanager.png │ ├── femanager_feusers_record.png │ ├── femanager_flexform_newfields.png │ ├── femanager_newfield1.png │ ├── femanager_newfield2.png │ ├── femanager_plugin.png │ └── femanager_settings.png ├── Includes.rst.txt ├── Index.rst ├── Installation │ └── Index.rst ├── Introduction │ ├── Images.txt │ └── Index.rst ├── Sitemap.rst ├── Upgrade │ └── Index.rst └── guides.xml ├── Resources ├── Private │ ├── .htaccess │ ├── Language │ │ ├── locallang.xlf │ │ ├── locallang_csh_fe_users.xlf │ │ ├── locallang_db.xlf │ │ └── locallang_mod.xlf │ ├── Layouts │ │ ├── Backend.html │ │ ├── Clean.html │ │ ├── Default.html │ │ └── Email.html │ ├── Partials │ │ ├── Backend │ │ │ └── Searchform.html │ │ ├── Fields │ │ │ ├── Address.html │ │ │ ├── Captcha.html │ │ │ ├── CaptchaField.html │ │ │ ├── City.html │ │ │ ├── Company.html │ │ │ ├── Country.html │ │ │ ├── DateOfBirth.html │ │ │ ├── Email.html │ │ │ ├── Fax.html │ │ │ ├── FirstName.html │ │ │ ├── Gender.html │ │ │ ├── Image.html │ │ │ ├── LastName.html │ │ │ ├── MiddleName.html │ │ │ ├── Name.html │ │ │ ├── Password.html │ │ │ ├── State.html │ │ │ ├── SubmitCreate.html │ │ │ ├── SubmitUpdate.html │ │ │ ├── Telephone.html │ │ │ ├── Terms.html │ │ │ ├── Title.html │ │ │ ├── Usergroup.html │ │ │ ├── Username.html │ │ │ ├── Www.html │ │ │ └── Zip.html │ │ ├── Mail │ │ │ └── UserProperties.html │ │ ├── Misc │ │ │ ├── AdditionalFields.html │ │ │ ├── ApprovalStep.html │ │ │ ├── DeleteLink.html │ │ │ ├── FlashMessages.html │ │ │ ├── FormErrors.html │ │ │ ├── Pagination.html │ │ │ ├── ResendConfirmation.html │ │ │ └── ValidationMessages.html │ │ └── User │ │ │ └── Searchform.html │ └── Templates │ │ ├── Edit │ │ ├── ConfirmUpdateRequest.html │ │ └── Edit.html │ │ ├── Email │ │ ├── CreateAdminConfirmation.html │ │ ├── CreateNotify.html │ │ ├── CreateUserConfirmation.html │ │ ├── CreateUserNotify.html │ │ ├── CreateUserNotifyRefused.html │ │ ├── Invitation.html │ │ ├── InvitationNotify.html │ │ ├── InvitationNotifyStep1.html │ │ ├── InvitationRefused.html │ │ ├── UpdateNotify.html │ │ ├── UpdateRequest.html │ │ └── UpdateRequestRefused.html │ │ ├── Invitation │ │ ├── Delete.html │ │ ├── Edit.html │ │ ├── New.html │ │ └── Status.html │ │ ├── New │ │ ├── ConfirmCreateRequest.html │ │ ├── CreateStatus.html │ │ ├── New.html │ │ └── ResendConfirmationDialogue.html │ │ ├── User │ │ ├── AjaxValidate.html │ │ ├── FileDelete.html │ │ ├── FileUpload.html │ │ ├── List.html │ │ ├── Show.html │ │ └── Validate.html │ │ └── UserBackend │ │ ├── Confirmation.html │ │ ├── List.html │ │ └── ListOpenUserConfirmations.html └── Public │ ├── Css │ ├── Additional.min.css │ ├── Backend.min.css │ └── Main.min.css │ ├── Icons │ ├── Extension.svg │ ├── Log.png │ └── relation.gif │ └── JavaScript │ ├── Backend.min.js │ ├── Data.min.js │ ├── Femanager.min.js │ ├── Validation.min.js │ └── Vendor │ ├── bootstrap.min.css │ └── bootstrap.min.js ├── composer.json ├── early-access-version.md ├── ext_conf_template.txt ├── ext_emconf.php ├── ext_localconf.php ├── ext_tables.php ├── ext_tables.sql ├── ext_typoscript_setup.typoscript ├── phive.xml ├── readme.md └── rector.php /.crowdin.yml: -------------------------------------------------------------------------------- 1 | files: 2 | - source: /Resources/Private/Language/ 3 | translation: /%original_path%/%two_letters_code%.%original_file_name% 4 | -------------------------------------------------------------------------------- /.ddev/commands/host/initialize: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ## Description: import given test data into ddev (database and configurations) 4 | ## Usage: initialize 5 | ## Example: "ddev import-data" 6 | 7 | if ! command -v "git-lfs" &> /dev/null 8 | then 9 | echo "COMMAND "git lfs" could not be found" 10 | echo "Please install git-lfs support, see: https://git-lfs.github.com/" 11 | exit 12 | fi 13 | 14 | git lfs pull 15 | ddev import-db --file=.project/data/db.sql.gz 16 | cp .Build/vendor/typo3/cms-install/Resources/Private/FolderStructureTemplateFiles/root-htaccess .Build/Web/.htaccess 17 | mkdir -p config/sites/main && cp .ddev/typo3/config.yaml config/sites/main/ 18 | mkdir -p config/system && cp .ddev/typo3/*.php config/system 19 | mkdir -p .Build/Web/fileadmin && cd .Build/Web && tar xf ../../.project/data/fileadmin.tar.gz 20 | ddev build-assets 21 | -------------------------------------------------------------------------------- /.ddev/commands/web/build-assets: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd Resources/Private && npm install && npm run run-build 4 | -------------------------------------------------------------------------------- /.ddev/commands/web/phive-update: -------------------------------------------------------------------------------- 1 | mkdir -p ~/.phive/ 2 | phive update 3 | -------------------------------------------------------------------------------- /.ddev/commands/web/qa: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | .Build/bin/rector process ./ --dry-run 4 | .project/phars/phpcpd ./ --exclude=.Build/* --exclude=var/* 5 | .project/phars/phpcs --standard=.project/qa/.phpcs_PSR1_PSR2_PSR12.xml Classes Tests 6 | .project/phars/php-cs-fixer fix Classes 7 | .project/phars/php-cs-fixer fix Tests 8 | .project/phars/phpmd Classes ansi .project/qa/.phpmd.xml 9 | .Build/bin/phpstan analyze -c .project/qa/phpstan.neon 10 | -------------------------------------------------------------------------------- /.ddev/commands/web/typo3: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This assumes that the typo3 command will be in the $PATH; if in vendor/bin/ it will be 4 | 5 | ## Description: Run TYPO3 CLI (typo3) command inside the web container 6 | ## Usage: typo3 [args] 7 | ## Example: "ddev typo3 site:list" or "ddev typo3 list" or "ddev typo3 extension:list" 8 | ## ProjectTypes: typo3 9 | 10 | .Build/bin/typo3 "$@" 11 | -------------------------------------------------------------------------------- /.ddev/docker-compose.browser.yaml: -------------------------------------------------------------------------------- 1 | version: '3.6' 2 | services: 3 | chrome: 4 | container_name: ddev-${DDEV_SITENAME}-chromedriver 5 | image: seleniarm/standalone-chromium:111.0 6 | restart: "no" 7 | volumes: 8 | - /dev/shm:/dev/shm 9 | ports: 10 | - 4444 11 | - "15722:5900" 12 | external_links: 13 | - ddev-router:$DDEV_HOSTNAME 14 | -------------------------------------------------------------------------------- /.ddev/traefik/certs/femanager.crt: -------------------------------------------------------------------------------- 1 | #ddev-generated 2 | -----BEGIN CERTIFICATE----- 3 | MIIEezCCAuOgAwIBAgIQYmCPwdsKryszjv/L8I4N0jANBgkqhkiG9w0BAQsFADBd 4 | MR4wHAYDVQQKExVta2NlcnQgZGV2ZWxvcG1lbnQgQ0ExGTAXBgNVBAsMEHN0ZWZh 5 | bkBBMTMubG9jYWwxIDAeBgNVBAMMF21rY2VydCBzdGVmYW5AQTEzLmxvY2FsMB4X 6 | DTIzMTEyODE1MjYzOFoXDTI2MDIyODE1MjYzOFowRDEnMCUGA1UEChMebWtjZXJ0 7 | IGRldmVsb3BtZW50IGNlcnRpZmljYXRlMRkwFwYDVQQLDBBzdGVmYW5AQTEzLmxv 8 | Y2FsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0uqtJMJv7fxY/k8f 9 | mRfG6m+wiFDPocmsbuWnn9QkGXaCAA6lZcmPtl1BgkKGIBQx0a/zlICgNweBXYNr 10 | b5+SkqqrO+0eZaqsfILJbCK71nC3xL1bZc3pkQtLMrWxKhqXgohu/KFpxqvnBdx6 11 | ZYAzbvAyHoD8gnyt0nv+iQAqgur5/mCXVlq/X0RbDwgEHKFnKIKuJtwrm8RlI5DW 12 | UIweIpzHHjoZ/75DbcsqhpMIRlSm2mJL30B9KScPnsM6QdCBr+jMAYGcMuBP1JO4 13 | cD/9dv7m1+VQLMNBZ1EnLPU9kfV0RfqsjLB626uqGezNewfZLBGoNV3KAiCSfHzK 14 | YVcJ5QIDAQABo4HPMIHMMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEF 15 | BQcDATAfBgNVHSMEGDAWgBTQwaffIeMpt6L8gWmJ0TtEt2+ODjCBgwYDVR0RBHww 16 | eoILKi5kZGV2LnNpdGWCCWxvY2FsaG9zdIIMKi5kZGV2LmxvY2FsggtkZGV2LXJv 17 | dXRlcoIQZGRldi1yb3V0ZXIuZGRldoIYZGRldi1yb3V0ZXIuZGRldl9kZWZhdWx0 18 | ghNmZW1hbmFnZXIuZGRldi5zaXRlhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBgQAc 19 | 3K57ekeIphuxr7RVzWxbI0CXLynkAOZWfFZKqz00DCV5BrpbVTwonAwY1MUGzJHE 20 | 7VKXQSyS0MRv4A/Uc2ciq1BRcnbCyVzbwG2jIO86OyWv0BDj+3JZZdXluzCQF9L8 21 | Ua5LAcQJAbHExR6yuHsj7AttS+Hw2yDAIfnToQi3FYPy1mEc3a8Whj+YGNveVU9k 22 | EU3HAcCBGO25pa4icvgoV7ZuPabdqdiDAkOPiMvLEllRH1Qq8RlWPJESuAlgkLEP 23 | 4gMXtaRmfAW8bkzX2T+TnqMdZh+rWb/UrEOoIKZYdIWbD7CKZ5JURUaFulE31ekT 24 | sG9kWcbzGpUmnWrJoqxg9Uxmyv97nnI5fvDVf/Z9YcCQv8r4KaANwxoRV8itimmL 25 | FQ6wBJKpjqmwKkufMot+oyUdtrF7kEN9ffwW9zhbkztYpyGgsHg5ODhUMdD0/maC 26 | yGg7T0MyOLbDcY50qx3U5ZHe5KIWhNn0tDK5/hBL/7kyl9O+v7r09w+iPiRhd+Y= 27 | -----END CERTIFICATE----- 28 | -------------------------------------------------------------------------------- /.ddev/traefik/certs/femanager.key: -------------------------------------------------------------------------------- 1 | #ddev-generated 2 | -----BEGIN PRIVATE KEY----- 3 | MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDS6q0kwm/t/Fj+ 4 | Tx+ZF8bqb7CIUM+hyaxu5aef1CQZdoIADqVlyY+2XUGCQoYgFDHRr/OUgKA3B4Fd 5 | g2tvn5KSqqs77R5lqqx8gslsIrvWcLfEvVtlzemRC0sytbEqGpeCiG78oWnGq+cF 6 | 3HplgDNu8DIegPyCfK3Se/6JACqC6vn+YJdWWr9fRFsPCAQcoWcogq4m3CubxGUj 7 | kNZQjB4inMceOhn/vkNtyyqGkwhGVKbaYkvfQH0pJw+ewzpB0IGv6MwBgZwy4E/U 8 | k7hwP/12/ubX5VAsw0FnUScs9T2R9XRF+qyMsHrbq6oZ7M17B9ksEag1XcoCIJJ8 9 | fMphVwnlAgMBAAECggEBAJ4DuUH/9bFbTCUCjE661IjQsnX97QBtwiS3I3UHjyAQ 10 | e+alEl8GugdLKIf5ZNjlqElLQ/auwtlXYyD3E2dmKn59JJpZ1FsgmecSaOr9vrIy 11 | cksP/khwExtaVbUhECDWGUpvAo98Mm3oXcUzX/NpL59ejn3x7runwuYdhR2IpVC8 12 | c9HfH+Bm69yd2JXuR58JajqmdO4Wz1s4TImEgjvLM7/4dqMICC71zw66T8F9+Y4i 13 | mGw9130rIRJlKTOSko4OlRyuXrAzNf47duR7+z1KlwHF4pHjf/gdXnkVb79EFX8w 14 | 7CoqXnuM/vzflSRvdlo+qVaYDCjf40sWDF0JJTwsigUCgYEA7nPKi0YFK/iO7TAB 15 | YJjlY4P6h02AEWrlaYa+BEqCvRqP8+kdRVS0dgA4DAjnNMzksymX2i7c0bWMRZYP 16 | UYrCVbwLCnaErqXsmOiD+IDxAaXWka/9ZTNl/3pvjSIW42acYg2JWLb392a0uvo9 17 | 3LrBNVR6F0HW2fAJDFtj5GbLUasCgYEA4nAkJ6CS/quaK2j6O1qPRETzhQv3wJAX 18 | D2qI4JxTniIFCup/V5MvOmbwy7Rp9pBPZfXif1rQjoWWG/JWCUyLQOv4RF5XZ5oN 19 | Yy0DLiq08OWozX7Cd34AFhbX+PF2OxO7U4kFhovTei6UE9B0Q4DXxyD9+uI0wn7h 20 | GSw99oQEoq8CgYAmnHFLpAbqW9Eo7wEKFzftqU1D43S9XUXQlJToNPh+jnKI2FJ5 21 | C4I9KUPqDvcBQbw2lqGUHsp62p7gFbBdT86v+0b+ZrqNXSi2ic/0yUw9LBFWfdzW 22 | KkB14el2PPLf15my9uYqi1YTpXnWXPbvav4mGIu8gFi96XRNn+7I6Sw7CQKBgAXE 23 | P1d3AmdT7XAvkzfRvZZKfz0jKeMQiFXPK780m/iJ+0Dk6etMB0bgej9lz9EEqdD5 24 | 6xO9N1R52HHLwR8pgN5dZAwxrt4nkTG2Yr9ZPRRpdNwO31r1rYDigguH8q/cd8fP 25 | 1IExrGgPKZw7kcpqTJR4pZ8vBZLycj8W3lkZ0ZhnAoGBAOzQv4CZGC4XG91XaQ16 26 | XXPOAFSHtNTfyuZLL9uVmrU1iFT6B4P2KsoD36Ci5J8f/jEGe5z5hT7kFnFwAZoB 27 | tqUb0niAEORZVKrI7xJ1Kc687v0TUE5wydIyo6cWoQUFulqOg0A1WQQlE0N2pl/z 28 | 7sXuExT0ijtJ7RqVYeHxAseu 29 | -----END PRIVATE KEY----- 30 | -------------------------------------------------------------------------------- /.ddev/traefik/config/femanager.yaml: -------------------------------------------------------------------------------- 1 | #ddev-generated 2 | 3 | http: 4 | routers: 5 | 6 | 7 | femanager-web-80-http: 8 | 9 | rule: HostRegexp(`femanager.ddev.site`) 10 | 11 | service: "femanager-web-80-http" 12 | tls: false 13 | entrypoints: 14 | - http-80 15 | 16 | 17 | femanager-web-8025-http: 18 | 19 | rule: HostRegexp(`femanager.ddev.site`) 20 | 21 | service: "femanager-web-8025-http" 22 | tls: false 23 | entrypoints: 24 | - http-8025 25 | 26 | 27 | 28 | 29 | 30 | 31 | femanager-web-80-https: 32 | 33 | rule: HostRegexp(`femanager.ddev.site`) 34 | 35 | service: "femanager-web-80-https" 36 | 37 | tls: true 38 | 39 | entrypoints: 40 | - http-443 41 | 42 | 43 | femanager-web-8025-https: 44 | 45 | rule: HostRegexp(`femanager.ddev.site`) 46 | 47 | service: "femanager-web-8025-https" 48 | 49 | tls: true 50 | 51 | entrypoints: 52 | - http-8026 53 | 54 | 55 | 56 | services: 57 | 58 | femanager-web-80-http: 59 | loadbalancer: 60 | servers: 61 | - url: http://ddev-femanager-web:80 62 | 63 | femanager-web-8025-http: 64 | loadbalancer: 65 | servers: 66 | - url: http://ddev-femanager-web:8025 67 | 68 | femanager-web-80-https: 69 | 70 | loadbalancer: 71 | servers: 72 | - url: http://ddev-femanager-web:80 73 | 74 | femanager-web-8025-https: 75 | 76 | loadbalancer: 77 | servers: 78 | - url: http://ddev-femanager-web:8025 79 | 80 | 81 | 82 | tls: 83 | certificates: 84 | - certFile: /mnt/ddev-global-cache/traefik/certs/femanager.crt 85 | keyFile: /mnt/ddev-global-cache/traefik/certs/femanager.key 86 | 87 | -------------------------------------------------------------------------------- /.ddev/typo3/additional.php: -------------------------------------------------------------------------------- 1 | [ 14 | 'Connections' => [ 15 | 'Default' => [ 16 | 'dbname' => 'db', 17 | 'host' => 'db', 18 | 'password' => 'db', 19 | 'port' => '3306', 20 | 'user' => 'db', 21 | ], 22 | ], 23 | ], 24 | // This GFX configuration allows processing by installed ImageMagick 6 25 | 'GFX' => [ 26 | 'processor' => 'ImageMagick', 27 | 'processor_path' => '/usr/bin/', 28 | 'processor_path_lzw' => '/usr/bin/', 29 | ], 30 | // This mail configuration sends all emails to mailhog 31 | 'MAIL' => [ 32 | 'transport' => 'smtp', 33 | 'transport_smtp_server' => 'localhost:1025', 34 | ], 35 | 'SYS' => [ 36 | 'trustedHostsPattern' => '.*.*', 37 | 'devIPmask' => '*', 38 | 'displayErrors' => 1, 39 | ], 40 | 'BE' => [ 41 | 'installToolPassword' => '$argon2i$v=19$m=65536,t=16,p=1$UnNyU1FXYmtzdEY3d2ZiOQ$7SkZw9NRaVvJC6gyTJj70pBUrnpFWtkVB3u0dz63uoE' 42 | ] 43 | ] 44 | ); 45 | } 46 | -------------------------------------------------------------------------------- /.ddev/typo3/config.yaml: -------------------------------------------------------------------------------- 1 | base: 'https://local.femanager.de/' 2 | errorHandling: { } 3 | baseVariants: 4 | - 5 | base: 'https://femanager8.ddev.site/' 6 | condition: 'applicationContext == "Development/DDEV"' 7 | languages: 8 | - 9 | title: English 10 | enabled: true 11 | base: / 12 | typo3Language: default 13 | locale: en_US.UTF-8 14 | iso-639-1: en 15 | websiteTitle: '' 16 | navigationTitle: '' 17 | hreflang: en-US 18 | direction: ltr 19 | flag: en-us-gb 20 | languageId: '0' 21 | rootPageId: 1 22 | routes: { } 23 | websiteTitle: '' 24 | -------------------------------------------------------------------------------- /.github/workflows/terupload.yaml: -------------------------------------------------------------------------------- 1 | name: TERUpload 2 | 3 | on: 4 | push: 5 | tags: 6 | - "**" 7 | 8 | jobs: 9 | TERUpload: 10 | runs-on: ubuntu-latest 11 | strategy: 12 | fail-fast: false 13 | steps: 14 | - uses: actions/checkout@v1 15 | - uses: tomasnorre/typo3-upload-ter@v2 16 | with: 17 | api-token: ${{ secrets.TYPO3_API_TOKEN }} 18 | -------------------------------------------------------------------------------- /.github/workflows/test-documentation.yml: -------------------------------------------------------------------------------- 1 | name: test documentation 2 | 3 | on: [ push, pull_request ] 4 | 5 | jobs: 6 | tests: 7 | name: documentation 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Checkout 11 | uses: actions/checkout@v4 12 | 13 | - name: Test if the documentation will render without warnings 14 | run: | 15 | mkdir -p Documentation-GENERATED-temp \ 16 | && docker run --rm --pull always -v $(pwd):/project \ 17 | ghcr.io/typo3-documentation/render-guides:latest --config=Documentation --no-progress --fail-on-log 18 | -------------------------------------------------------------------------------- /Classes/Controller/AbstractFrontendController.php: -------------------------------------------------------------------------------- 1 | ratelimiterService = $ratelimiterService; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Classes/Controller/DataController.php: -------------------------------------------------------------------------------- 1 | countryZonesDataProvider = $countryZonesDataProvider; 18 | } 19 | 20 | public function getStatesForCountryAction(string $country): ResponseInterface 21 | { 22 | $countryZones = $this->countryZonesDataProvider->getCountryZonesForCountryIso3($country); 23 | $jsonData = []; 24 | foreach ($countryZones as $countryZone) { 25 | $jsonData[$countryZone->getIsoCode()] = $countryZone->getLocalName(); 26 | } 27 | 28 | return $this->jsonResponse(json_encode($jsonData, JSON_THROW_ON_ERROR)); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Classes/Controller/HasConfirmationByFormSubmitTrait.php: -------------------------------------------------------------------------------- 1 | settings['new']['email']['activateEmailLinkFormConfirmation'] ?? false) { 11 | if(!$this->request->hasArgument('approve')) { 12 | $this->view->assignMultiple([ 13 | 'user' => $user, 14 | 'hash' => $hash, 15 | 'actionName' => $this->request->getControllerActionName(), 16 | 'controllerName' => $this->request->getControllerName(), 17 | 'showApprovalStep' => 1, 18 | 'status' => $status, 19 | 'languageKeyText' => "form" . ucfirst($status) . "Text", 20 | 'languageKeySubmitButton' => "form" . ucfirst($status) . "SubmitButton"]); 21 | return true; 22 | } 23 | } 24 | return false; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /Classes/DataProcessor/AbstractDataProcessor.php: -------------------------------------------------------------------------------- 1 | configuration = $configuration; 46 | $this->settings = $settings; 47 | $this->contentObject = $contentObject; 48 | $this->controllerArguments = $controllerArguments; 49 | } 50 | 51 | public function initializeDataProcessor() 52 | { 53 | } 54 | 55 | /** 56 | * @return mixed 57 | */ 58 | public function getConfiguration(string $path = '') 59 | { 60 | $configuration = $this->configuration; 61 | if (!empty($path)) { 62 | $configuration = ArrayUtility::getValueByPath($configuration, $path, '.'); 63 | } 64 | return $configuration; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Classes/DataProcessor/DataProcessorInterface.php: -------------------------------------------------------------------------------- 1 | controllerArguments['user'])) { 22 | foreach (GeneralUtility::trimExplode(',', $this->getConfiguration('fieldNames'), true) as $fieldName) { 23 | $this->controllerArguments['user'] 24 | ->getPropertyMappingConfiguration() 25 | ->forProperty($fieldName) 26 | ->setTypeConverterOption( 27 | DateTimeConverter::class, 28 | DateTimeConverter::CONFIGURATION_DATE_FORMAT, 29 | LocalizationUtility::translate('tx_femanager_domain_model_user.dateFormat') 30 | ); 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Classes/DataProvider/CountryDataProvider.php: -------------------------------------------------------------------------------- 1 | countryRepository = GeneralUtility::makeInstance(CountryRepository::class); 18 | } 19 | 20 | public function getCountries(): array 21 | { 22 | return $this->countryRepository->findAllOrderedBy('shortNameLocal')->toArray(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Classes/DataProvider/CountryZonesDataProvider.php: -------------------------------------------------------------------------------- 1 | countryZoneRepository = GeneralUtility::makeInstance(CountryZoneRepository::class); 23 | $this->countryRepository = GeneralUtility::makeInstance(CountryRepository::class); 24 | } 25 | 26 | /** @return CountryZone[] */ 27 | public function getCountryZonesForCountryIso3(string $countryIso3): array 28 | { 29 | $country = $this->getCountryForIsoCode3($countryIso3); 30 | if ($country === null) { 31 | return []; 32 | } 33 | $countryZones = $this->countryZoneRepository->findByCountry($country)->toArray(); 34 | usort( 35 | $countryZones, 36 | fn (CountryZone $left, CountryZone $right) => // @phpstan-ignore-line 37 | strcasecmp((string)$left->getLocalName(), (string)$right->getLocalName()) 38 | ); 39 | return $countryZones; 40 | } 41 | 42 | public function hasCountryZonesForCountryIso3(string $countryIso3): bool 43 | { 44 | return $this->countryZoneRepository->countByCountryIsoCodeA3($countryIso3) > 0; 45 | } 46 | 47 | /** 48 | * @return Country|null 49 | */ 50 | private function getCountryForIsoCode3(string $countryIso3): ?Country // @phpstan-ignore-line 51 | { 52 | $countries = $this->countryRepository->findAllowedByIsoCodeA3($countryIso3); 53 | $country = null; 54 | if ((is_countable($countries) ? count($countries) : 0) === 1) { 55 | $country = array_values($countries)[0]; 56 | } 57 | return $country; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Classes/DependencyInjection/CompilerPass/ChangeClassDatamapPass.php: -------------------------------------------------------------------------------- 1 | hasDefinition(DataMap::class)) { 16 | return; 17 | } 18 | 19 | $definition = $container->findDefinition(DataMap::class); 20 | $definition->setClass(\In2code\Femanager\Persistence\Generic\Mapper\DataMap::class); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Domain/Repository/LogRepository.php: -------------------------------------------------------------------------------- 1 | flexFormService = $flexFormService ?? GeneralUtility::makeInstance(FlexFormService::class); 29 | } 30 | 31 | /** 32 | * @throws Exception 33 | */ 34 | public function isPluginWithViewOnGivenPage(int $pageIdentifier, string $pluginName): bool 35 | { 36 | $pluginService = GeneralUtility::makeInstance(PluginService::class); 37 | $allowedPlugins = $pluginService->getAllowedPlugins(); 38 | 39 | if (in_array($pluginName, $allowedPlugins)) { 40 | $queryBuilder = ObjectUtility::getQueryBuilder(self::TABLE_NAME); 41 | $cType = str_replace('tx_', '', $pluginName); 42 | $pluginOnPageQuery = $queryBuilder 43 | ->select('uid') 44 | ->from(self::TABLE_NAME) 45 | ->where( 46 | $queryBuilder->expr()->eq( 47 | 'pid', 48 | $queryBuilder->createNamedParameter($pageIdentifier, PDO::PARAM_INT) 49 | ), 50 | $queryBuilder->expr()->eq( 51 | 'CType', 52 | $queryBuilder->createNamedParameter($cType, PDO::PARAM_STR) 53 | ) 54 | ) 55 | ->executeQuery(); 56 | return count($pluginOnPageQuery->fetchAllAssociative()) > 0; 57 | } 58 | 59 | return false; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Classes/Domain/Repository/UserGroupRepository.php: -------------------------------------------------------------------------------- 1 | createQuery(); 25 | if ($removeList) { 26 | $query->matching($query->logicalNot($query->in('uid', explode(',', $removeList)))); 27 | } 28 | $query->setOrderings(['title' => QueryInterface::ORDER_ASCENDING]); 29 | return $query->execute(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Classes/Domain/Service/AutoAdminConfirmation/AbstractConfirmation.php: -------------------------------------------------------------------------------- 1 | config = $config; 41 | $this->user = $user; 42 | $this->settings = $settings; 43 | $this->contentObject = $contentObject; 44 | } 45 | 46 | /** 47 | * Skip manual confirmation from admin? 48 | * 49 | * @return bool 50 | */ 51 | public function isAutoConfirmed(): bool 52 | { 53 | return false; 54 | } 55 | 56 | /** 57 | * @return array 58 | */ 59 | public function getConfig(): array 60 | { 61 | return $this->config; 62 | } 63 | 64 | /** 65 | * @return User 66 | */ 67 | public function getUser(): User 68 | { 69 | return $this->user; 70 | } 71 | 72 | /** 73 | * @return array 74 | */ 75 | public function getSettings(): array 76 | { 77 | return $this->settings; 78 | } 79 | 80 | /** 81 | * @return ContentObjectRenderer 82 | */ 83 | public function getContentObject(): ContentObjectRenderer 84 | { 85 | return $this->contentObject; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /Classes/Domain/Service/AutoAdminConfirmation/ConfirmationInterface.php: -------------------------------------------------------------------------------- 1 | isException() && $this->isGivenDomainsPartOfEmail()) { 20 | return true; 21 | } 22 | return false; 23 | } 24 | 25 | protected function isGivenDomainsPartOfEmail(): bool 26 | { 27 | $domains = GeneralUtility::trimExplode(',', $this->getConfig()['confirmByEmailDomains'], true); 28 | foreach ($domains as $domain) { 29 | if (stristr($this->getEmailDomain(), (string)$domain)) { 30 | return true; 31 | } 32 | } 33 | return false; 34 | } 35 | 36 | protected function isException(): bool 37 | { 38 | $exceptionDomains = 39 | GeneralUtility::trimExplode(',', $this->getConfig()['confirmByEmailDomainsExceptions'], true); 40 | return in_array($this->getEmailDomain(), $exceptionDomains); 41 | } 42 | 43 | /** 44 | * Get domain of an email address: "alex@in2code.de" => "in2code.de" 45 | */ 46 | protected function getEmailDomain(): string 47 | { 48 | $email = $this->getUser()->getEmail(); 49 | $parts = explode('@', $email); 50 | return $parts[1]; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Classes/Domain/Service/PluginService.php: -------------------------------------------------------------------------------- 1 | getParsedBody())) { 29 | foreach (array_keys($request->getParsedBody()) as $key) { 30 | if (in_array($key, self::ALLOWED_PLUGINS)) { 31 | return $key; 32 | } 33 | } 34 | } 35 | return ''; 36 | } 37 | 38 | public function getAllowedPlugins(): array 39 | { 40 | return self::ALLOWED_PLUGINS; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Classes/Domain/Service/StoreInDatabaseService.php: -------------------------------------------------------------------------------- 1 | value 24 | * 25 | * @var array 26 | */ 27 | protected $properties = []; 28 | 29 | /** 30 | * @var ConnectionPool 31 | */ 32 | protected $databaseConnection; 33 | 34 | /** 35 | * Executes the storage 36 | * 37 | * @return int uid of inserted record 38 | */ 39 | public function execute() 40 | { 41 | $insertTable = $this->databaseConnection->getConnectionForTable($this->getTable()); 42 | $insertTable->insert( 43 | $this->getTable(), 44 | $this->getProperties() 45 | ); 46 | 47 | return (int)$insertTable->lastInsertId($this->getTable()); 48 | } 49 | 50 | /** 51 | * Set TableName 52 | * 53 | * @param string $table 54 | */ 55 | public function setTable($table) 56 | { 57 | $table = preg_replace('/[^a-zA-Z0-9_-]/', '', $table); 58 | $this->table = $table; 59 | } 60 | 61 | /** 62 | * Get TableName 63 | * 64 | * @return string 65 | */ 66 | public function getTable() 67 | { 68 | return $this->table; 69 | } 70 | 71 | /** 72 | * Read properties 73 | * 74 | * @return array 75 | */ 76 | public function getProperties() 77 | { 78 | return $this->properties; 79 | } 80 | 81 | /** 82 | * Add property/value pair to array 83 | * 84 | * @param $propertyName 85 | * @param $value 86 | */ 87 | public function addProperty($propertyName, $value) 88 | { 89 | $propertyName = preg_replace('/[^a-zA-Z0-9_-]/', '', (string)$propertyName); 90 | $this->properties[$propertyName] = $value; 91 | } 92 | 93 | /** 94 | * Remove property/value pair form array by its key 95 | * 96 | * @param $propertyName 97 | */ 98 | public function removeProperty($propertyName) 99 | { 100 | unset($this->properties[$propertyName]); 101 | } 102 | 103 | /** 104 | * Initialize 105 | */ 106 | public function __construct() 107 | { 108 | $this->databaseConnection = GeneralUtility::makeInstance(ConnectionPool::class); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /Classes/Domain/Validator/CaptchaValidator.php: -------------------------------------------------------------------------------- 1 | init(); 26 | if ($this->captchaEnabled() && (!is_string($value) || !$this->validCaptcha($value))) { 27 | $this->addError('validationErrorCaptcha', 0, ['fieldName' => 'captcha']); 28 | } 29 | } 30 | 31 | /** 32 | * Check if captcha is valid 33 | */ 34 | protected function validCaptcha(string $captcha): bool 35 | { 36 | $isValid = false; 37 | $wordRepository = GeneralUtility::makeInstance(WordRepository::class); 38 | $wordObject = $wordRepository->getWord(); 39 | $wordHash = $wordObject->getWordHash(); 40 | if (!empty($wordHash) && !empty($captcha) && $wordObject->getHashFunction() === 'md5') { 41 | $userHash = md5(strtolower(mb_convert_encoding($captcha, 'ISO-8859-1'))); 42 | if (hash_equals($wordHash, $userHash)) { 43 | $wordRepository->cleanUpWord(); 44 | $isValid = true; 45 | } 46 | } 47 | return $isValid; 48 | } 49 | 50 | /** 51 | * Check if captcha is enabled (TypoScript, and sr_freecap loaded) 52 | * 53 | * @return bool 54 | */ 55 | protected function captchaEnabled(): bool 56 | { 57 | return ExtensionManagementUtility::isLoaded('sr_freecap') 58 | && !empty($this->validationSettings['captcha']['captcha']); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Classes/Domain/Validator/ShouldValidateStateCondition.php: -------------------------------------------------------------------------------- 1 | isStaticInfoTablesLoaded = ExtensionManagementUtility::isLoaded('static_info_tables'); 22 | if ($this->isStaticInfoTablesLoaded) { 23 | $this->countryZonesDataProvider = GeneralUtility::makeInstance(CountryZonesDataProvider::class); 24 | } 25 | } 26 | 27 | public function shouldValidate(User $user, string $fieldName, array $validationSettings): bool 28 | { 29 | return $this->isStaticInfoTablesLoaded 30 | && $this->countryHasZones(ObjectAccess::getProperty($user, 'country')); 31 | } 32 | 33 | protected function countryHasZones($countryIso3) 34 | { 35 | return $this->countryZonesDataProvider->hasCountryZonesForCountryIso3($countryIso3); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Classes/Domain/Validator/ValidationConditionInterface.php: -------------------------------------------------------------------------------- 1 | user = $user; 16 | } 17 | 18 | public function getUser(): ?User 19 | { 20 | return $this->user; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Event/AfterMailSendEvent.php: -------------------------------------------------------------------------------- 1 | email; 22 | } 23 | 24 | public function getService(): SendMailService 25 | { 26 | return $this->service; 27 | } 28 | 29 | public function getVariables(): array 30 | { 31 | return $this->variables; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Classes/Event/AfterUserUpdateEvent.php: -------------------------------------------------------------------------------- 1 | status; 18 | } 19 | 20 | public function getHash(): string 21 | { 22 | return $this->hash; 23 | } 24 | 25 | public function getUser(): ?User 26 | { 27 | return $this->user; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Classes/Event/BeforeMailBodyRenderEvent.php: -------------------------------------------------------------------------------- 1 | standAloneView = $standAloneView; 28 | $this->variables = $variables; 29 | $this->service = $service; 30 | } 31 | 32 | /** 33 | * @return StandaloneView 34 | */ 35 | public function getStandaloneView(): StandaloneView 36 | { 37 | return $this->standAloneView; 38 | } 39 | 40 | /** 41 | * @return SendMailService 42 | */ 43 | public function getService(): SendMailService 44 | { 45 | return $this->service; 46 | } 47 | 48 | /** 49 | * @return array 50 | */ 51 | public function getVariables(): array 52 | { 53 | return $this->variables; 54 | } 55 | 56 | /** 57 | * @param StandaloneView $standAloneView 58 | */ 59 | public function setStandaloneView(StandaloneView $standAloneView): void 60 | { 61 | $this->standAloneView = $standAloneView; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Classes/Event/BeforeMailSendEvent.php: -------------------------------------------------------------------------------- 1 | email; 22 | } 23 | 24 | public function getService(): SendMailService 25 | { 26 | return $this->service; 27 | } 28 | 29 | public function getVariables(): array 30 | { 31 | return $this->variables; 32 | } 33 | 34 | public function setEmail(Email $email): void 35 | { 36 | $this->email = $email; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Classes/Event/BeforeUpdateUserEvent.php: -------------------------------------------------------------------------------- 1 | user = $user; 16 | } 17 | 18 | public function getUser(): ?User 19 | { 20 | return $this->user; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Event/BeforeUserConfirmEvent.php: -------------------------------------------------------------------------------- 1 | user; 21 | } 22 | 23 | public function getHash(): string 24 | { 25 | return $this->hash; 26 | } 27 | 28 | public function getStatus(): string 29 | { 30 | return $this->status; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Classes/Event/BeforeUserCreateEvent.php: -------------------------------------------------------------------------------- 1 | user; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Event/CreateConfirmationRequestEvent.php: -------------------------------------------------------------------------------- 1 | mode; 22 | } 23 | 24 | public function getUser(): ?User 25 | { 26 | return $this->user; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Event/DeleteUserEvent.php: -------------------------------------------------------------------------------- 1 | user; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Event/FinalCreateEvent.php: -------------------------------------------------------------------------------- 1 | action; 18 | } 19 | 20 | public function getUser(): ?User 21 | { 22 | return $this->user; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Classes/Event/FinalUpdateEvent.php: -------------------------------------------------------------------------------- 1 | user; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Event/ImpersonateEvent.php: -------------------------------------------------------------------------------- 1 | user; 18 | } 19 | 20 | public function getBackendUserId(): ?int 21 | { 22 | return $this->backendUserId; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Classes/Event/InviteUserConfirmedEvent.php: -------------------------------------------------------------------------------- 1 | user; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Event/InviteUserCreateEvent.php: -------------------------------------------------------------------------------- 1 | user; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Event/InviteUserEditEvent.php: -------------------------------------------------------------------------------- 1 | hash; 18 | } 19 | 20 | public function getUser(): ?User 21 | { 22 | return $this->user; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Classes/Event/InviteUserUpdateEvent.php: -------------------------------------------------------------------------------- 1 | user; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Event/RefuseUserEvent.php: -------------------------------------------------------------------------------- 1 | user; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Event/UniqueUserEvent.php: -------------------------------------------------------------------------------- 1 | unique = $unique; 22 | } 23 | 24 | public function isUnique(): bool 25 | { 26 | return $this->unique; 27 | } 28 | 29 | public function getEmailOrUsername(): string 30 | { 31 | return $this->emailOrUsername; 32 | } 33 | 34 | public function getFieldName(): string 35 | { 36 | return $this->fieldName; 37 | } 38 | 39 | public function getUser(): ?User 40 | { 41 | return $this->user; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Classes/Event/UserLogEvent.php: -------------------------------------------------------------------------------- 1 | additionalProperties; 21 | } 22 | 23 | public function getState(): int 24 | { 25 | return $this->state; 26 | } 27 | 28 | public function getUser(): ?User 29 | { 30 | return $this->user; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Classes/Event/UserWasConfirmedByAdminEvent.php: -------------------------------------------------------------------------------- 1 | request; 21 | } 22 | 23 | public function getUser(): User 24 | { 25 | return $this->user; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Classes/Exception/FileNotFoundException.php: -------------------------------------------------------------------------------- 1 | finisherService = $finisherService; 41 | } 42 | 43 | /** 44 | * Call finisher classes after submit 45 | * 46 | * @param string $actionMethodName 47 | * @param array $settings 48 | */ 49 | public function callFinishers( 50 | User $user, 51 | $actionMethodName, 52 | $settings, 53 | ContentObjectRenderer $contentObject 54 | ) { 55 | foreach ($this->getFinisherClasses($settings) as $finisherSettings) { 56 | $this->finisherService->init($user, $settings, $contentObject); 57 | $this->finisherService->setClass($finisherSettings['class']); 58 | $this->finisherService->setRequirePath($finisherSettings['require'] ?? ''); 59 | $this->finisherService->setConfiguration($finisherSettings['config'] ?? []); 60 | $this->finisherService->setActionMethodName($actionMethodName); 61 | $this->finisherService->start(); 62 | } 63 | } 64 | 65 | /** 66 | * Get all finisher classes from typoscript and sort them 67 | * 68 | * @param array $settings 69 | * @return array 70 | */ 71 | protected function getFinisherClasses($settings) 72 | { 73 | $finishers = (array)$settings['finishers']; 74 | ksort($finishers); 75 | return $finishers; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /Classes/Middleware/CleanUserGroupMiddleware.php: -------------------------------------------------------------------------------- 1 | getParsedBody(); 17 | if ( 18 | is_array($requestBody['tx_femanager_registration']['user']['usergroup'] ?? null) 19 | && empty($requestBody['tx_femanager_registration']['user']['usergroup'][0]) 20 | && empty($requestBody['tx_femanager_registration']['user']['usergroup']['__identity']) 21 | ) { 22 | unset($requestBody['tx_femanager_registration']['user']['usergroup'][0]); 23 | } 24 | $request = $request->withParsedBody($requestBody); 25 | return $handler->handle($request); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Classes/Middleware/RemovePasswordIfEmptyMiddleware.php: -------------------------------------------------------------------------------- 1 | getParsedBody(); 20 | 21 | if (isset($requestBody['tx_femanager_edit'])) { 22 | $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); 23 | $typoscript = $configurationManager->getConfiguration( 24 | ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT, 25 | 'femanager' 26 | ); 27 | 28 | if (!empty($typoscript['plugin.']['tx_femanager.']['settings.']['edit.']['misc.']['keepPasswordIfEmpty']) && 29 | empty($requestBody['tx_femanager_edit']['user']['password']) && 30 | empty($requestBody['tx_femanager_edit']['password_repeat'])) { 31 | unset($requestBody['tx_femanager_edit']['user']['password']); 32 | unset($requestBody['tx_femanager_edit']['password_repeat']); 33 | $request = $request->withParsedBody($requestBody); 34 | } 35 | } 36 | 37 | return $handler->handle($request); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Classes/Persistence/Generic/Mapper/DataMap.php: -------------------------------------------------------------------------------- 1 | getClassName() === User::class || $this->getClassName() === UserGroup::class) { 25 | $this->recordType = null; 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/UserFunc/UserOptions.php: -------------------------------------------------------------------------------- 1 | getPages($params) !== []) { 25 | $params['items'] = [ 26 | $params['items'][0], // please choose 27 | $params['items'][1], // currently logged in user 28 | ]; 29 | 30 | foreach ($this->getUsers($params) as $user) { 31 | $params['items'][] = [$user['username'], $user['uid']]; 32 | } 33 | } 34 | } 35 | 36 | protected function getUsers(array $params): array 37 | { 38 | $queryBuilder = ObjectUtility::getQueryBuilder(User::TABLE_NAME); 39 | $result = $queryBuilder 40 | ->select('uid', 'username') 41 | ->from(User::TABLE_NAME) 42 | ->where('pid in (' . $this->getPageUidList($params) . ')') 43 | ->setMaxResults(10000)->orderBy('username', 'ASC')->executeQuery(); 44 | return $result->fetchAll(); 45 | } 46 | 47 | /** 48 | * Get lists of page uids where the users are stored with recursive setting 49 | */ 50 | protected function getPageUidList(array $params): string 51 | { 52 | $list = ''; 53 | $pageTreeService = GeneralUtility::makeInstance(PageTreeService::class); 54 | $depth = $params['flexParentDatabaseRow']['recursive']; 55 | foreach ($this->getPages($params) as $pageIdentifier) { 56 | $list .= $pageTreeService->getTreeList($pageIdentifier, $depth, 0, '1'); 57 | $list .= ','; 58 | } 59 | return rtrim($list, ','); 60 | } 61 | 62 | protected function getPages(array $params): array 63 | { 64 | $pages = []; 65 | if (!empty($params['flexParentDatabaseRow']['pages'][0]['uid'])) { 66 | foreach ($params['flexParentDatabaseRow']['pages'] as $page) { 67 | $pages[] = $page['uid']; 68 | } 69 | } 70 | return $pages; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /Classes/Utility/BackendUserUtility.php: -------------------------------------------------------------------------------- 1 | getTSConfig()['tx_femanager.']['UserBackend.']['enableLoginAs'] ?? 0; 22 | 23 | return $userAuthentication->user['admin'] === 1 || (int)$isUserBackendEnableLoginAs === 1; 24 | } 25 | 26 | /** 27 | * @return BackendUserAuthentication 28 | */ 29 | public static function getBackendUserAuthentication() 30 | { 31 | return parent::getBackendUserAuthentication(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Classes/Utility/FileUtility.php: -------------------------------------------------------------------------------- 1 | getUsername()); 28 | } 29 | 30 | /** 31 | * Create Hash from String and TYPO3 Encryption Key (if available) 32 | * 33 | * @param string $string Any String to hash 34 | * @param int $length Hash Length 35 | * @return string Hashed String 36 | */ 37 | protected static function hashString(string $string, int $length = 16): string 38 | { 39 | return substr(md5($string . self::getEncryptionKey()), 0, $length); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Classes/Utility/LocalizationUtility.php: -------------------------------------------------------------------------------- 1 | setTitle(LocalizationUtility::translateByState($state)); 36 | $log->setState($state); 37 | $log->setUser($user); 38 | $this->logRepository->add($log); 39 | } 40 | 41 | $this->eventDispatcher->dispatch(new UserLogEvent($user, $state, $additionalProperties)); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Be/GetClassNameOnActionViewHelper.php: -------------------------------------------------------------------------------- 1 | arguments['actionName']; 24 | $className = $this->arguments['className']; 25 | $fallbackClassName = $this->arguments['fallbackClassName']; 26 | 27 | if ($this->getCurrentActionName() === $actionName) { 28 | return $className; 29 | } 30 | 31 | return $fallbackClassName; 32 | } 33 | 34 | /** 35 | * Return the current action name from the controller context 36 | * 37 | * @throws FluidViewHelperException 38 | */ 39 | protected function getCurrentActionName(): string 40 | { 41 | if (! $this->renderingContext instanceof RenderingContext) { 42 | throw new FluidViewHelperException( 43 | 'Something went wrong; RenderingContext should be available in ViewHelper', 44 | 1638341674 45 | ); 46 | } 47 | return $this->renderingContext->getRequest()->getControllerActionName(); 48 | } 49 | 50 | /** 51 | * Register all arguments for this viewhelper 52 | */ 53 | public function initializeArguments() 54 | { 55 | parent::initializeArguments(); 56 | $this->registerArgument( 57 | 'actionName', 58 | 'string', 59 | 'action name to compare with current action', 60 | true 61 | ); 62 | $this->registerArgument( 63 | 'className', 64 | 'string', 65 | 'classname that should be returned if action fits', 66 | false, 67 | ' btn-info' 68 | ); 69 | $this->registerArgument( 70 | 'fallbackClassName', 71 | 'string', 72 | 'fallback classname if action does not fit', 73 | false, 74 | '' 75 | ); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Be/IsConfirmationModuleActivatedViewHelper.php: -------------------------------------------------------------------------------- 1 | getAttribute('language') instanceof SiteLanguage) { 36 | $languageService = 37 | $this->languageServiceFactory->createFromSiteLanguage($request->getAttribute('language')); 38 | } 39 | 40 | $returnArray = []; 41 | $countries = $this->countryProvider->getAll(); 42 | foreach ($countries as $country) { 43 | $returnArray[$country->getAlpha3IsoCode()] = 44 | $languageService !== null ? 45 | $languageService->sL($country->getLocalizedNameLabel()) : 46 | $country->getName(); 47 | } 48 | asort($returnArray); 49 | return $returnArray; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Misc/BackendEditLinkViewHelper.php: -------------------------------------------------------------------------------- 1 | registerArgument('tableName', 'string', 'Records table name (like "fe_users")', true); 25 | $this->registerArgument('identifier', 'integer', 'Record identifier to edit', true); 26 | $this->registerArgument('addReturnUrl', 'bool', 'Add current URI as returnUrl', false, true); 27 | } 28 | 29 | /** 30 | * Get an URI for backend edit 31 | * 32 | * @param array $arguments 33 | * @param \Closure $renderChildrenClosure 34 | * @param RenderingContextInterface $renderingContext 35 | * @return string 36 | * 37 | * @SuppressWarnings(PHPMD.UnusedFormalParameter) 38 | */ 39 | public static function renderStatic( 40 | array $arguments, 41 | \Closure $renderChildrenClosure, 42 | RenderingContextInterface $renderingContext 43 | ): string { 44 | return BackendUtility::getBackendEditUri( 45 | $arguments['tableName'], 46 | $arguments['identifier'], 47 | $arguments['addReturnUrl'] 48 | ); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Misc/BackendNewLinkViewHelper.php: -------------------------------------------------------------------------------- 1 | registerArgument('tableName', 'string', 'Records table name (like "fe_users")', true); 25 | $this->registerArgument('addReturnUrl', 'bool', 'Add current URI as returnUrl', false, true); 26 | } 27 | 28 | /** 29 | * Get an URI for new records in backend 30 | * 31 | * @param array $arguments 32 | * @param \Closure $renderChildrenClosure 33 | * @param RenderingContextInterface $renderingContext 34 | * @return string 35 | * 36 | * @SuppressWarnings(PHPMD.UnusedFormalParameter) 37 | */ 38 | public static function renderStatic( 39 | array $arguments, 40 | \Closure $renderChildrenClosure, 41 | RenderingContextInterface $renderingContext 42 | ): string { 43 | return BackendUtility::getBackendNewUri( 44 | $arguments['tableName'], 45 | BackendUtility::getPageIdentifier(), 46 | $arguments['addReturnUrl'] 47 | ); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Misc/CaptchaEnabledViewHelper.php: -------------------------------------------------------------------------------- 1 | registerArgument('settings', 'bool', 'array $settings TypoScript', true); 21 | } 22 | 23 | /** 24 | * Check if captcha is enabled 25 | * @throws FluidViewHelperException 26 | */ 27 | public function render(): bool 28 | { 29 | if (! $this->renderingContext instanceof RenderingContext) { 30 | throw new FluidViewHelperException( 31 | 'Something went wrong; RenderingContext should be available in ViewHelper', 32 | 1638341672 33 | ); 34 | } 35 | $controllerName = strtolower((string)$this->renderingContext->getRequest()->getControllerName()); 36 | 37 | return ExtensionManagementUtility::isLoaded('sr_freecap') 38 | && $this->templateVariableContainer->getByPath( 39 | 'settings.' . $controllerName . '.validation.captcha.captcha' 40 | ); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Misc/ExplodeViewHelper.php: -------------------------------------------------------------------------------- 1 | registerArgument('string', 'string', 'Any list (e.g. "a,b,c,d")', false); 19 | $this->registerArgument('seperator', 'string', 'Separator sign (e.g. ",")', false, ','); 20 | $this->registerArgument('trim', 'bool', 'Should be trimmed?', false, true); 21 | } 22 | 23 | /** 24 | * View helper to explode a list 25 | * @return array 26 | */ 27 | public function render() 28 | { 29 | $string = $this->arguments['string']; 30 | $separator = $this->arguments['seperator']; 31 | $trim = $this->arguments['trim']; 32 | 33 | return $trim ? GeneralUtility::trimExplode($separator, $string, true) : explode($separator, (string)$string); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Misc/GetFirstViewHelper.php: -------------------------------------------------------------------------------- 1 | registerUniversalTagAttributes(); 23 | $this->registerArgument('objectStorage', 'object', 'first subobject of objectstorage', false); 24 | } 25 | 26 | /** 27 | * View helper to get first subobject of objectstorage 28 | */ 29 | public function render(): mixed 30 | { 31 | $objectStorage = $this->arguments['objectStorage']; 32 | if ($objectStorage === null) { 33 | return ''; 34 | } 35 | foreach ($objectStorage as $object) { 36 | return $object; 37 | } 38 | 39 | // try to get value from originalRequest 40 | if ($this->configurationManager->isFeatureEnabled('rewrittenPropertyMapper')) { 41 | // seperate if version is 6.2 or lower 42 | if ((method_exists($this, 'hasMappingErrorOccured') && $this->hasMappingErrorOccured()) || 43 | (method_exists($this, 'hasMappingErrorOccurred') && $this->hasMappingErrorOccurred()) 44 | ) { 45 | return $this->getValueAttribute(); 46 | } 47 | } 48 | 49 | return ''; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Misc/RequestViewHelper.php: -------------------------------------------------------------------------------- 1 | arguments['parameter']; 36 | $htmlspecialchars = $this->arguments['htmlspecialchars']; 37 | 38 | $parts = $this->init($parameter); 39 | $result = $this->getVariableFromDepth($parts); 40 | if ($htmlspecialchars === true) { 41 | if (is_string($result)) { 42 | $result = htmlspecialchars($result); 43 | } 44 | } 45 | if (is_array($result) or $result === null) { 46 | // ensure that the return value is always as string 47 | $result=''; 48 | } 49 | return $result; 50 | } 51 | 52 | protected function getVariableFromDepth(?array $param): array|string|null 53 | { 54 | if (is_array($this->variable)) { 55 | $this->variable = $this->variable[$param[$this->depth]] ?? null; 56 | $this->depth++; 57 | $this->getVariableFromDepth($param); 58 | } 59 | 60 | return $this->variable; 61 | } 62 | 63 | /** 64 | * Initially sets $this->variable 65 | * 66 | * @param $parameter 67 | * @return array 68 | */ 69 | protected function init($parameter) 70 | { 71 | $parts = explode('|', (string)$parameter); 72 | $this->variable = GeneralUtility::_GP($parts[0]); 73 | if ($this->testVariables) { 74 | $this->variable = $this->testVariables[$parts[0]]; 75 | } 76 | 77 | return $parts; 78 | } 79 | 80 | /** 81 | * Register all arguments for this viewhelper 82 | */ 83 | public function initializeArguments() 84 | { 85 | parent::initializeArguments(); 86 | $this->registerArgument('parameter', 'string', 'like tx_ext_pi1|list|field', false, ''); 87 | $this->registerArgument('htmlspecialchars', 'bool', 'Enable/Disable htmlspecialchars', false, true); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Misc/UpperViewHelper.php: -------------------------------------------------------------------------------- 1 | registerArgument('string', 'string', 'string', false); 18 | } 19 | 20 | public function render(): string 21 | { 22 | return ucfirst((string)($this->arguments['string'] ?? '')); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Pagination/UriViewHelper.php: -------------------------------------------------------------------------------- 1 | registerArgument('name', 'string', 'identifier important if more widgets on same page', false, 'widget'); 26 | $this->registerArgument('arguments', 'array', 'Arguments', false, []); 27 | } 28 | 29 | /** 30 | * Build an uri to current action with &tx_ext_plugin[currentPage]=2 31 | * 32 | * @return string The rendered uri 33 | * @throws FluidViewHelperException 34 | */ 35 | public function render(): string 36 | { 37 | if (! $this->renderingContext instanceof RenderingContext) { 38 | throw new FluidViewHelperException( 39 | 'Something went wrong; RenderingContext should be available in ViewHelper', 40 | 1638341671 41 | ); 42 | } 43 | $uriBuilder = GeneralUtility::makeInstance(ExtbaseUriBuilder::class); 44 | $extensionName = $this->renderingContext->getRequest()->getControllerExtensionName(); 45 | $pluginName = $this->renderingContext->getRequest()->getPluginName(); 46 | $extensionService = GeneralUtility::makeInstance(ExtensionService::class); 47 | $pluginNamespace = $extensionService->getPluginNamespace($extensionName, $pluginName); 48 | $argumentPrefix = $pluginNamespace . '[' . $this->arguments['name'] . ']'; 49 | $arguments = $this->hasArgument('arguments') ? $this->arguments['arguments'] : []; 50 | if ($this->hasArgument('action')) { 51 | $arguments['action'] = $this->arguments['action']; 52 | } 53 | if ($this->hasArgument('format') && $this->arguments['format'] !== '') { 54 | $arguments['format'] = $this->arguments['format']; 55 | } 56 | $uri = $uriBuilder 57 | ->reset() 58 | ->setRequest($this->renderingContext->getRequest()) 59 | ->setArguments([$argumentPrefix => $arguments]) 60 | ->setAddQueryString(true) 61 | ->setArgumentsToBeExcludedFromQueryString([$argumentPrefix, 'cHash']); 62 | 63 | return $uri->build(); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Repository/GetFirstViewHelper.php: -------------------------------------------------------------------------------- 1 | arguments['objects']; 20 | if (method_exists($objects, 'getFirst')) { 21 | return $objects->getFirst(); 22 | } 23 | return null; 24 | } 25 | 26 | /** 27 | * Initialize the arguments. 28 | * 29 | * @api 30 | */ 31 | public function initializeArguments() 32 | { 33 | parent::initializeArguments(); 34 | $this->registerArgument('objects', 'object ', 'Call getFirst() method of object storage', true); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Validation/AbstractValidationViewHelper.php: -------------------------------------------------------------------------------- 1 | renderingContext instanceof RenderingContext) { 28 | throw new FluidViewHelperException( 29 | 'Something went wrong; RenderingContext should be available in ViewHelper', 30 | 1638341336 31 | ); 32 | } 33 | 34 | if ($this->getControllerName() === 'invitation' && 35 | $this->renderingContext->getRequest()->getControllerActionName() === 'edit') { 36 | $validationName = 'validationEdit'; 37 | } 38 | 39 | return $validationName; 40 | } 41 | 42 | /** 43 | * Return controllername in lowercase 44 | * 45 | * @return string "new", "edit", "invitation" 46 | * @throws FluidViewHelperException 47 | */ 48 | protected function getControllerName(): string 49 | { 50 | if (! $this->renderingContext instanceof RenderingContext) { 51 | throw new FluidViewHelperException( 52 | 'Something went wrong; RenderingContext should be available in ViewHelper', 53 | 1638341335 54 | ); 55 | } 56 | return strtolower((string)$this->renderingContext->getRequest()->getControllerName()); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Validation/FormValidationDataViewHelper.php: -------------------------------------------------------------------------------- 1 | arguments['settings']; 27 | $fieldName = $this->arguments['fieldName']; 28 | $additionalAttributes = $this->arguments['additionalAttributes']; 29 | 30 | if ($settings !== []) { 31 | $this->logger->debug( 32 | 'Settings should not be filled any more in field partials. Pls update your femanager partial files.' 33 | ); 34 | } 35 | $validationService = GeneralUtility::makeInstance( 36 | ValidationSettingsService::class, 37 | $this->getControllerName(), 38 | $this->getValidationName() 39 | ); 40 | if ($validationService->isValidationEnabled('client')) { 41 | $validationString = $validationService->getValidationStringForField($fieldName); 42 | if (!empty($validationString)) { 43 | if (!empty($additionalAttributes['data-validation'])) { 44 | $additionalAttributes['data-validation'] .= ',' . $validationString; 45 | } else { 46 | $additionalAttributes['data-validation'] = $validationString; 47 | } 48 | } 49 | } 50 | return $additionalAttributes; 51 | } 52 | 53 | /** 54 | * Initialize the arguments. 55 | * 56 | * @api 57 | */ 58 | public function initializeArguments() 59 | { 60 | parent::initializeArguments(); 61 | $this->registerArgument('settings', 'array ', 'all TypoScript settings for this form', true); 62 | $this->registerArgument('fieldName', 'string ', 'Fieldname which should get validated', true); 63 | $this->registerArgument('additionalAttributes', 'array ', '$additionalAttributes for this field', false); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Classes/ViewHelpers/Validation/IsRequiredFieldViewHelper.php: -------------------------------------------------------------------------------- 1 | arguments['fieldName']; 26 | $settings = $this->getSettingsConfiguration(); 27 | 28 | return !empty($settings[$this->getControllerName()][$this->getValidationName()][$fieldName]['required']) 29 | || !empty($settings[$this->getControllerName()][$this->getValidationName()][$fieldName]['fileRequired']); 30 | } 31 | 32 | protected function getSettingsConfiguration(string $pluginName = 'Pi1'): array 33 | { 34 | return (array)$this->configurationManager->getConfiguration( 35 | ConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS, 36 | 'Femanager', 37 | $pluginName 38 | ); 39 | } 40 | 41 | /** 42 | * Initialize the arguments. 43 | * 44 | * @api 45 | */ 46 | public function initializeArguments() 47 | { 48 | parent::initializeArguments(); 49 | $this->registerArgument('fieldName', 'string ', 'Check if this field is a required field', true); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Configuration/Backend/Modules.php: -------------------------------------------------------------------------------- 1 | [ 9 | 'parent' => 'web', 10 | 'position' => ['after' => 'web_info'], 11 | 'access' => 'user', 12 | 'icon' => 'EXT:femanager/Resources/Public/Icons/Extension.svg', 13 | 'path' => '/module/web/femanager', 14 | 'labels' => 'LLL:EXT:femanager/Resources/Private/Language/locallang_mod.xlf', 15 | 'extensionName' => 'Femanager', 16 | 'controllerActions' => [ 17 | UserBackendController::class => [ 18 | 'list', 19 | 'confirmation', 20 | 'userLogout', 21 | 'confirmUser', 22 | 'refuseUser', 23 | 'listOpenUserConfirmations', 24 | 'resendUserConfirmationRequest', 25 | ], 26 | ], 27 | ], 28 | ]; 29 | } 30 | return []; 31 | -------------------------------------------------------------------------------- /Configuration/Extbase/Persistence/Classes.php: -------------------------------------------------------------------------------- 1 | [ 10 | 'tableName' => User::TABLE_NAME, 11 | 'properties' => [ 12 | 'terms' => [ 13 | 'fieldName' => 'tx_femanager_terms', 14 | ], 15 | 'termsDateOfAcceptance' => [ 16 | 'fieldName' => 'tx_femanager_terms_date_of_acceptance', 17 | ], 18 | ], 19 | ], 20 | UserGroup::class => [ 21 | 'tableName' => UserGroup::TABLE_NAME, 22 | ], 23 | ]; 24 | -------------------------------------------------------------------------------- /Configuration/FlexForms/FlexFormDetail.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1 4 | 5 | 6 | 7 | 8 | LLL:EXT:femanager/Resources/Private/Language/locallang_db.xlf:flexform.show.title 9 | array 10 | 11 | 12 | 13 | 14 | select 15 | selectSingle 16 | 17 | 18 | LLL:EXT:femanager/Resources/Private/Language/locallang_db.xlf:pleaseChoose 19 | 20 | 21 | 22 | LLL:EXT:femanager/Resources/Private/Language/locallang_db.xlf:flexform.show.user.1 23 | [this] 24 | 25 | 26 | 1 27 | 1 28 | 0 29 | fe_users 30 | AND fe_users.deleted = 0 AND fe_users.disable = 0 order by fe_users.last_name 31 | 1 32 | In2code\Femanager\UserFunc\UserOptions->addOptions 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Configuration/Icons.php: -------------------------------------------------------------------------------- 1 | [ 7 | SvgIconProvider::class, 8 | 'source' => 'EXT:femanager/Resources/Public/Icons/Extension.svg', 9 | ], 10 | ]; 11 | -------------------------------------------------------------------------------- /Configuration/RequestMiddlewares.php: -------------------------------------------------------------------------------- 1 | [ 10 | 'in2code/femanager/clean-user-group' => [ 11 | 'target' => CleanUserGroupMiddleware::class, 12 | 'before' => [ 13 | 'typo3/cms-frontend/tsfe', 14 | ], 15 | 'after' => [ 16 | 'typo3/cms-frontend/page-argument-validator', 17 | ], 18 | ], 19 | 'in2code/femanager/remove-passowrd-if-empty' => [ 20 | 'target' => RemovePasswordIfEmptyMiddleware::class, 21 | 'before' => [ 22 | 'typo3/cms-frontend/shortcut-and-mountpoint-redirect', 23 | ], 24 | 'after' => [ 25 | 'typo3/cms-frontend/prepare-tsfe-rendering', 26 | ], 27 | ], 28 | ], 29 | ]; 30 | -------------------------------------------------------------------------------- /Configuration/Services.php: -------------------------------------------------------------------------------- 1 | addCompilerPass(new ChangeClassDatamapPass()); 14 | 15 | $services = $configurator->services(); 16 | $defaults = $services->defaults(); 17 | $defaults->autoconfigure(); 18 | $defaults->autowire(); 19 | $defaults->private(); 20 | 21 | if (class_exists(Country::class)) { 22 | $containerBuilder->registerForAutoconfiguration(StaticInfoTables::class)->addTag('femanager.userfunc.staticinfotables'); 23 | $containerBuilder->addCompilerPass(new PublicServicePass('femanager.userfunc.staticinfotables')); 24 | 25 | $services->set(StaticInfoTables::class) 26 | ->public(); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /Configuration/Services.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | _defaults: 3 | autowire: true 4 | autoconfigure: true 5 | public: false 6 | 7 | In2code\Femanager\: 8 | resource: '../Classes/*' 9 | exclude: '../Classes/Domain/Model/*' 10 | 11 | In2code\Femanager\Domain\Validator\AbstractValidator: 12 | public: true 13 | In2code\Femanager\DataProvider\CountryDataProvider: 14 | public: true 15 | In2code\Femanager\DataProvider\CountryZonesDataProvider: 16 | public: true 17 | In2code\Femanager\Domain\Repository\LogRepository: 18 | public: true 19 | In2code\Femanager\Domain\Repository\UserGroupRepository: 20 | public: true 21 | In2code\Femanager\Domain\Repository\UserRepository: 22 | public: true 23 | In2code\Femanager\Domain\Service\RatelimiterService: 24 | public: true 25 | In2code\Femanager\Domain\Service\SendMailService: 26 | public: true 27 | In2code\Femanager\Domain\Validator\ShouldValidateStateCondition: 28 | public: true 29 | In2code\Femanager\Finisher\FinisherRunner: 30 | public: true 31 | In2code\Femanager\Utility\LogUtility: 32 | public: true 33 | In2code\Femanager\Domain\Service\PluginService: 34 | public: true 35 | -------------------------------------------------------------------------------- /Configuration/TCA/Overrides/sys_template.php: -------------------------------------------------------------------------------- 1 | seconds. Set to 0 to disable rate limiter. 45 | limit = 10 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Configuration/UserTsConfig/BackendModule.typoscript: -------------------------------------------------------------------------------- 1 | tx_femanager.UserBackend.confirmation { 2 | # User must confirm their profile - only in this case they are shown in Backend Module "Confirmation" 3 | filter.userConfirmation = 1 4 | 5 | # UI for resending UserConfirmationRequests are shown in confirmation view 6 | ResendUserConfirmationRequest = 0 7 | } 8 | -------------------------------------------------------------------------------- /Configuration/page.tsconfig: -------------------------------------------------------------------------------- 1 | @import 'EXT:femanager/Configuration/TSConfig/ContentElementWizard.typoscript' 2 | -------------------------------------------------------------------------------- /Documentation/Features/ConfirmUserConfirmationRefused/Index.rst: -------------------------------------------------------------------------------- 1 | .. include:: ../../Includes.txt 2 | 3 | 4 | .. _ConfirmUserConfirmationRefused: 5 | 6 | ConfirmUser Confirmation Refused 7 | ----------------------- 8 | 9 | Introduction 10 | ^^^^^^^^^^^^ 11 | 12 | **Available since 6.4.0** 13 | 14 | Some virus scanners are preloading all links in an email. 15 | If this happens in an user confirmation mail, the user is deleted automatically. 16 | This feature can prevent this behavior. 17 | 18 | Configuration 19 | ^^^^^^^^^^^^^ 20 | 21 | This feature can be enabled via typoscript.automatically 22 | 23 | The default value is 0, so this feature has to be enabled. 24 | 25 | :: 26 | 27 | plugin.tx_femanager.settings { 28 | new { 29 | email.createUserConfirmation.confirmUserConfirmationRefused = 1 30 | } 31 | } 32 | 33 | 34 | -------------------------------------------------------------------------------- /Documentation/Features/FillEmailAsUsername/Index.rst: -------------------------------------------------------------------------------- 1 | .. include:: ../../Includes.rst.txt 2 | 3 | 4 | .. _fillEmailAsUsername: 5 | 6 | Fill Email as Username during registraion 7 | ----------------------------------------- 8 | 9 | Introduction 10 | ^^^^^^^^^^^^ 11 | 12 | **Available since 2.0** 13 | 14 | If this setting is enabled, the mail address is taken as username. The setting can be applied in three situations: 15 | * During registration (new) 16 | * During edit process of an existing user (edit) 17 | * During Invitation process (invite) 18 | 19 | Configuration 20 | ^^^^^^^^^^^^^ 21 | 22 | Enable the "fillEmailWithUsername" option for the area (new, edit, invite), where you like to apply it. 23 | 24 | Example for "new" area: 25 | 26 | :typoscript:`plugin.tx_femanager.settings.new.fillEmailWithUsername = 1` 27 | 28 | Please take care, that the username is not set to required, otherwise it will not work 29 | 30 | :typoscript:`plugin.tx_femanager.settings.new.validation.username.required = 0` 31 | 32 | Example 33 | ''''''' 34 | 35 | TypoScript: 36 | 37 | .. code-block:: typoscript 38 | 39 | plugin.tx_femanager.settings { 40 | new { 41 | fillEmailWithUsername = 1 42 | validation.username.required = 0 43 | } 44 | } 45 | 46 | Remarks 47 | ^^^^^^^ 48 | 49 | Please mind, if you use this setting in the edit view, a user is able to change his username. 50 | Therefor you should always take care, via validation settings, that a username (and also the mail address) stays 51 | unique for your users. 52 | -------------------------------------------------------------------------------- /Documentation/Features/RateLimiter/Index.rst: -------------------------------------------------------------------------------- 1 | .. include:: ../../Includes.rst.txt 2 | 3 | .. _ratelimiter: 4 | 5 | Rate Limiter 6 | ------------ 7 | 8 | Basics 9 | ^^^^^^ 10 | 11 | If you want prevent, that your registration forms, you can enable the rate limiter. 12 | 13 | Note: The limiter is enabled by default. 14 | 15 | 16 | TypoScript Settings 17 | ^^^^^^^^^^^^^^^^^^^ 18 | 19 | 20 | .. code-block:: typoscript 21 | 22 | plugin.tx_femanager { 23 | settings { 24 | ratelimiter { 25 | # Number of seconds for the sliding window rate limiter 26 | timeframe = {$plugin.tx_femanager.settings.ratelimiter.timeframe} 27 | # Request count. How many requests are allowed in the last seconds. Set to 0 to disable rate limiter. 28 | limit = {$plugin.tx_femanager.settings.ratelimiter.limit} 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Documentation/Features/ResendUserConfirmationRequest/Index.rst: -------------------------------------------------------------------------------- 1 | .. include:: ../../Includes.rst.txt 2 | 3 | 4 | .. _resendUserConfirmationRequest: 5 | 6 | Resend User Confirmation Request 7 | -------------------------------- 8 | 9 | Introduction 10 | ^^^^^^^^^^^^ 11 | 12 | **Available since 4.2.0** 13 | 14 | This feature adds a new view in the backend module to list user, which did not confirm their user accounts. An frontend 15 | user admin is now able to resend the confirmation mail or decline (and delete) the user via backend. 16 | 17 | 18 | Frontend View 19 | ^^^^^^^^^^^^^ 20 | 21 | An editor can setup a new view "resend confirmation mail". Frontend users, who started their registration process and did 22 | not confirm their email so far, can resend a confirmation mail. 23 | 24 | Configuration. Add the plugin "Femanager" to a page and select "resend confirmation mail". 25 | 26 | IMPORTANT: If you want to use these new views and you did use femanager version 4.1 or older, you need open existing plugins and save them again, in order to allow the 27 | usage of this views. 28 | 29 | Sometimes unconfirmed users are trying to trigger the confirmation mail again by registering again with the same email or username. They get an error "username / email already existing". Since 4.2, an additional message with a "resend confirmation mail" link is displayed in those cases where the existing user has not yet confirmed his registration. 30 | 31 | For this message to be displayed, you need to have the following typoscript setting configured: 32 | 33 | .. code-block:: typoscript 34 | 35 | settings.showResendUserConfirmationRequestView = {your pid} 36 | 37 | The pid is the page uid where your "resend confirmation mail" plugin resides. 38 | 39 | 40 | Backend View 41 | ^^^^^^^^^^^^ 42 | 43 | Lists all frontend users, which did not confirm their email so far. An admin is able to decline (delete) users or 44 | resend an email with a confirmation link. 45 | 46 | .. image:: ../../Images/femanager_backend4.png 47 | 48 | 49 | To activate the feature add the userTSConfig: 50 | 51 | .. code-block:: typoscript 52 | 53 | tx_femanager.UserBackend.confirmation.ResendUserConfirmationRequest = 1 54 | 55 | Backend Configuration 56 | ^^^^^^^^^^^^^^^^^^^^^ 57 | 58 | Take care, that the setting "module.tx_femanager.settings.configPID" is set up for any site (see :ref:`Configuration in Confirmation Module <_confirmation-module>`) 59 | -------------------------------------------------------------------------------- /Documentation/Features/ShowListUsers/Index.rst: -------------------------------------------------------------------------------- 1 | .. include:: ../../Includes.rst.txt 2 | .. include:: Images.txt 3 | 4 | .. _showlistusers: 5 | 6 | Show and List Frontend Users 7 | ---------------------------- 8 | 9 | This Feature allows you to display the data of the current user, a selected user by an editor or list users and provide 10 | a detail page. 11 | 12 | Caution: Please take care that you do not disclose information in public environments and be careful which data you show in the detail view. 13 | 14 | Show the current user 15 | ^^^^^^^^^^^^^^^^^^^^^ 16 | 17 | Useful, if you want to show a "read only view" for the currently logged in frontend user. 18 | 19 | **Configuration:** 20 | 21 | #. Add a femanager_detail plugin to your page 22 | #. in the field "User to show" choose "Logged in FE User" 23 | 24 | .. image:: ../../Images/feature-showlistusers-loggedin-user.png 25 | :align: left 26 | :border: 0 27 | :name: create1 28 | :vspace: 20 29 | 30 | Show a given user 31 | ^^^^^^^^^^^^^^^^^ 32 | 33 | You can provide a detail view of a given frontend user 34 | 35 | .. image:: ../../Images/feature-showlistusers-loggedin-user1.png 36 | :align: left 37 | :border: 0 38 | :name: create1 39 | :vspace: 20 40 | 41 | #. Add a femanager_detail plugin to your page 42 | #. select the user to be shown in the field "User to show" 43 | 44 | 45 | .. attention:: 46 | If you add this plugin with the selected view, take care that you do not disclose information in public environments and be careful which data you show in the detail view. 47 | If you don't select any frontend user, any users can be displayed by passing the get param &tx_femanager_pi1[user]=XX to the detail page url. Be careful to avoid unwanted information disclosure! 48 | 49 | 50 | 51 | List Users 52 | ^^^^^^^^^^^ 53 | 54 | #. Add a a femanager_list plugin to your page 55 | #. set the plugin options to show the users you want to display 56 | 57 | 58 | .. image:: ../../Images/feature-showlistusers-loggedin-user2.png 59 | :align: left 60 | :border: 0 61 | :name: create1 62 | :vspace: 20 63 | 64 | Plugin Options: 65 | 66 | * Show Searchfield: You can provide a searchfield, to filter the users 67 | * Limit: Define how many users are listed per page 68 | * Order by: Choose which field should be used to order the list 69 | * Sorting: Define sort ordering 70 | * Show from usergroup (empty = show all): Select one or more usergroups. If you don't select a group, all frontend users are displayed 71 | -------------------------------------------------------------------------------- /Documentation/Features/Templates/Index.rst: -------------------------------------------------------------------------------- 1 | .. include:: ../../Includes.rst.txt 2 | 3 | .. _changetemplates: 4 | 5 | Use own HTML Templates 6 | ---------------------- 7 | 8 | Basics 9 | ^^^^^^ 10 | 11 | If you want to modify a HTML-File of femanager, you should not overwrite them directly in the extension folder. 12 | Think about upcoming versions with important bugfixes or security-patches. 13 | 14 | There are two ways to use own HTML-Templates (and Partials / Layouts) instead of the original Templates. 15 | 16 | Replace all HTML Templates from Femanager with own Templates 17 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 18 | 19 | You can copy all Files from 20 | - EXT:femanager/Resources/Private/Templates/ 21 | - EXT:femanager/Resources/Private/Partials/ 22 | - EXT:femanager/Resources/Private/Layouts/ 23 | 24 | to a new folder in fileadmin - e.g. fileadmin/templates/femanager/ and modify them as you want. 25 | After that, you should say femanager to use the new Templates with some lines of TypoScript setup: 26 | 27 | .. code-block:: typoscript 28 | 29 | plugin.tx_femanager { 30 | view { 31 | templateRootPath = fileadmin/templates/femanager/Templates/ 32 | partialRootPath = fileadmin/templates/femanager/Partials/ 33 | layoutRootPath = fileadmin/templates/femanager/Layouts/ 34 | } 35 | } 36 | 37 | Replace single HTML Template-Files 38 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 39 | 40 | You can copy only the Files that you want to modify from 41 | - EXT:femanager/Resources/Private/Templates/ 42 | - EXT:femanager/Resources/Private/Partials/ 43 | - EXT:femanager/Resources/Private/Layouts/ 44 | 45 | to a new folder in fileadmin - e.g. fileadmin/templates/femanager/ and modify them as you want. 46 | After that, you should say femanager to use the old folders and merge them with the new folders 47 | 48 | .. code-block:: typoscript 49 | 50 | plugin.tx_femanager { 51 | view { 52 | templateRootPath > 53 | templateRootPaths { 54 | 10 = EXT:femanager/Resources/Private/Templates/ 55 | 20 = fileadmin/templates/femanager/Templates/ 56 | } 57 | partialRootPath > 58 | partialRootPaths { 59 | 10 = EXT:femanager/Resources/Private/Partials/ 60 | 20 = fileadmin/templates/femanager/Partials/ 61 | } 62 | layoutRootPath > 63 | layoutRootPaths { 64 | 10 = EXT:femanager/Resources/Private/Layouts/ 65 | 20 = fileadmin/templates/femanager/Layouts/ 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /Documentation/Images/feature-showlistusers-loggedin-user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/feature-showlistusers-loggedin-user.png -------------------------------------------------------------------------------- /Documentation/Images/feature-showlistusers-loggedin-user1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/feature-showlistusers-loggedin-user1.png -------------------------------------------------------------------------------- /Documentation/Images/feature-showlistusers-loggedin-user2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/feature-showlistusers-loggedin-user2.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_backend1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_backend1.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_backend2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_backend2.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_backend3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_backend3.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_backend4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_backend4.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_backendmodule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_backendmodule.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_backendmodule2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_backendmodule2.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_constants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_constants.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_create1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_create1.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_create2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_create2.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_create3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_create3.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_edit1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_edit1.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_edit2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_edit2.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_extensionmanager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_extensionmanager.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_feusers_record.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_feusers_record.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_flexform_newfields.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_flexform_newfields.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_newfield1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_newfield1.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_newfield2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_newfield2.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_plugin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_plugin.png -------------------------------------------------------------------------------- /Documentation/Images/femanager_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Documentation/Images/femanager_settings.png -------------------------------------------------------------------------------- /Documentation/Includes.rst.txt: -------------------------------------------------------------------------------- 1 | .. You can put central messages to display on all pages here 2 | -------------------------------------------------------------------------------- /Documentation/Index.rst: -------------------------------------------------------------------------------- 1 | .. include:: Includes.rst.txt 2 | 3 | .. _start: 4 | 5 | ========= 6 | femanager 7 | ========= 8 | 9 | :Extension key: 10 | femanager 11 | 12 | :Package name: 13 | in2code/femanager 14 | 15 | :Version: 16 | 8.2.0 17 | 18 | :Language: 19 | en,de 20 | 21 | :Author: 22 | Alex Kellner, Stefan Busemann, Daniel Hoffmann 23 | 24 | :Repository: 25 | https://github.com/in2code-de/femanager 26 | 27 | :Community-Support: 28 | https://typo3.slack.com/messages/C0NAHDRJB/ 29 | 30 | :Rendered: 31 | |today| 32 | 33 | ---- 34 | 35 | Femanager offers an extensive frontend user registration including management functions. It is based on a modern TYPO3 version as well as Extbase and Fluid and offers a variety of extension options. 36 | 37 | ---- 38 | 39 | **Table of Contents:** 40 | 41 | .. toctree:: 42 | :maxdepth: 2 43 | :titlesonly: 44 | 45 | Introduction/Index 46 | Installation/Index 47 | Upgrade/Index 48 | Features/Index 49 | FAQ/Index 50 | Changelog/Index 51 | 52 | .. Meta Menu 53 | 54 | .. toctree:: 55 | :hidden: 56 | 57 | Sitemap 58 | -------------------------------------------------------------------------------- /Documentation/Introduction/Images.txt: -------------------------------------------------------------------------------- 1 | .. |create1| image:: ../Images/femanager_create1.png 2 | .. :align: left 3 | .. :border: 0 4 | .. :name: create1 5 | .. :vspace: 20 6 | 7 | .. |create2| image:: ../Images/femanager_create2.png 8 | .. :align: left 9 | .. :border: 0 10 | .. :name: create2 11 | .. :vspace: 20 12 | 13 | .. |create3| image:: ../Images/femanager_create3.png 14 | .. :align: left 15 | .. :border: 0 16 | .. :name: create3 17 | .. :vspace: 20 18 | 19 | .. |edit1| image:: ../Images/femanager_edit1.png 20 | .. :align: left 21 | .. :border: 0 22 | .. :name: edit1 23 | .. :vspace: 20 24 | 25 | .. |edit2| image:: ../Images/femanager_edit2.png 26 | .. :align: left 27 | .. :border: 0 28 | .. :name: edit2 29 | .. :vspace: 20 30 | 31 | .. |backend1| image:: ../Images/femanager_backend1.png 32 | .. :align: left 33 | .. :border: 0 34 | .. :name: backend1 35 | .. :vspace: 20 36 | 37 | .. |backend2| image:: ../Images/femanager_backend2.png 38 | .. :align: left 39 | .. :border: 0 40 | .. :name: backend2 41 | .. :vspace: 20 42 | 43 | .. |backend3| image:: ../Images/femanager_backend3.png 44 | .. :align: left 45 | .. :border: 0 46 | .. :name: backend3 47 | .. :vspace: 20 48 | 49 | .. |backend4| image:: ../Images/femanager_backend4.png 50 | .. :align: left 51 | .. :border: 0 52 | .. :name: backend4 53 | .. :vspace: 20 54 | -------------------------------------------------------------------------------- /Documentation/Introduction/Index.rst: -------------------------------------------------------------------------------- 1 | .. include:: ../Includes.rst.txt 2 | .. include:: Images.txt 3 | 4 | .. _introduction: 5 | 6 | Introduction 7 | ============ 8 | 9 | .. only:: html 10 | 11 | :ref:`what` | :ref:`requirements` | :ref:`suggests` | 12 | 13 | 14 | .. _what: 15 | 16 | What does it do? 17 | ---------------- 18 | 19 | Femanager is an extension for a TYPO3 Frontend-User Registration. 20 | Maybe you know sr_feuser_register but you want to use a more modern extension, give femanager a try. 21 | 22 | This extension basicly brings an easy-to-use frontend-user-registration with a profile manager to your system. 23 | In addition femanager was developed to be very flexible and to bring a lot of features out of the box. 24 | 25 | Note: Login and a *I forgot my password* function is part of the core and not part of femanager. 26 | 27 | 28 | .. _requirements: 29 | 30 | Requirements 31 | ------------ 32 | 33 | - TYPO3 12.4 34 | - Extbase / Fluid 35 | - Best use with jQuery and bootstrap 36 | 37 | 38 | .. _suggests: 39 | 40 | Suggestions 41 | ----------- 42 | 43 | - static_info_tables (to show localized countryselection) 44 | - sr_freecap (captcha for a spam prevention) 45 | -------------------------------------------------------------------------------- /Documentation/Sitemap.rst: -------------------------------------------------------------------------------- 1 | :template: sitemap.html 2 | 3 | .. include:: /Includes.rst.txt 4 | 5 | ======= 6 | Sitemap 7 | ======= 8 | 9 | .. The sitemap.html template will insert here the page tree automatically. 10 | -------------------------------------------------------------------------------- /Documentation/guides.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 16 | 21 | 24 | 27 | 30 | 31 | -------------------------------------------------------------------------------- /Resources/Private/.htaccess: -------------------------------------------------------------------------------- 1 | # Apache < 2.3 2 | 3 | Order allow,deny 4 | Deny from all 5 | Satisfy All 6 | 7 | 8 | # Apache >= 2.3 9 | 10 | Require all denied 11 | 12 | -------------------------------------------------------------------------------- /Resources/Private/Language/locallang_csh_fe_users.xlf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | username 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Resources/Private/Language/locallang_mod.xlf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 | Frontend Users 8 | 9 | 10 | FE Manager allows you to see a list of Frontend Users and filter them. Show Users from a usergroup or from a searchword or simply show users which are online 11 | 12 | 13 | FE Manager 14 | 15 | 16 | Femanager 17 | 18 | 19 | Registration 20 | 21 | 22 | Description of Registration 23 | 24 | 25 | Edit 26 | 27 | 28 | Description of Edit 29 | 30 | 31 | List 32 | 33 | 34 | Description of List 35 | 36 | 37 | Detail 38 | 39 | 40 | Description of Detail 41 | 42 | 43 | Invitation 44 | 45 | 46 | Description of Invitation 47 | 48 | 49 | Resend Confirmation Mail 50 | 51 | 52 | Description of Resend Confirmation Mail 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /Resources/Private/Layouts/Backend.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 | 10 |
11 |
12 |
13 |
14 |
15 | 16 |
17 | 18 | List 19 | 20 | 21 | Admin Confirmation 22 | 23 | 24 | 25 | Open User Confirmtions 26 | 27 | 28 |
29 |
30 |
31 |
32 | 33 |
34 |
35 |
36 |
37 |
38 |   39 |
40 |
41 | 42 |
43 |
44 |
45 |
46 | 47 |
48 | 49 |
{flashMessage.message}
50 |
51 |
52 |
53 | 54 | 55 |
56 |
57 | 58 | -------------------------------------------------------------------------------- /Resources/Private/Layouts/Clean.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/Private/Layouts/Default.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 |
6 | -------------------------------------------------------------------------------- /Resources/Private/Layouts/Email.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Backend/Searchform.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 | 3 |
4 | 7 | 12 |
13 |
14 | 17 |
18 |
19 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Address.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 15 |
16 |
17 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Captcha.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 18 |
19 |
    20 |
  • 21 | Please install extension sr_freecap 22 |
  • 23 |
  • 24 | And enable it with 25 | plugin.tx_femanager.settings.new.validation.captcha.captcha = 1 or 26 | plugin.tx_femanager.settings.edit.validation.captcha.captcha = 1 27 | in TypoScript 28 |
  • 29 |
30 | 31 |
32 |
33 |
34 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/CaptchaField.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 | {namespace freeCap=SJBR\SrFreecap\ViewHelpers} 3 |
4 | 8 |
9 | 15 | 16 | 17 |
18 |
19 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/City.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 15 |
16 |
17 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Company.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 15 |
16 |
17 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Country.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 | 3 |
4 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 |
21 | 22 | 23 | 31 | 32 | 33 | 34 | 41 | 42 | 43 | 44 | {countryName} 45 | 46 | 47 | {countryName} 48 | 49 | 50 | 51 | 52 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/DateOfBirth.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 18 |
19 |
20 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Email.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Fax.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/FirstName.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 15 |
16 |
17 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Gender.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 |
11 | 20 |
21 |
22 | 31 |
32 |
33 | 42 |
43 |
44 |
45 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Image.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 11 | 12 | 17 | 18 | 19 |
20 | 21 | 22 | Delete image 27 |
28 |
29 |
30 |
31 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/LastName.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 15 |
16 |
17 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/MiddleName.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 15 |
16 |
17 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Name.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 15 |
16 |
17 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Password.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 17 |
18 |
19 | 20 |
21 | 27 |
28 | 35 |
36 |
37 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/State.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 | 3 |
4 | 10 |
11 | 19 |
20 |
21 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/SubmitCreate.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 7 |
8 |
9 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/SubmitUpdate.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 7 |
8 |
9 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Telephone.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Terms.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 |
4 |
5 | 22 |
23 |
24 |
25 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Title.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 15 |
16 |
17 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Usergroup.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 | 3 | 4 | 5 | 6 | 7 |
8 | 14 |
15 | 27 |
28 |
29 |
30 | 31 | 32 | 33 | 40 | 46 |
47 | 58 |
59 | 60 | 61 | ]]>
62 |
63 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Username.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 15 |
16 |
17 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Www.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 15 |
16 |
17 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Fields/Zip.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 |
3 | 9 |
10 | 15 |
16 |
17 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Misc/AdditionalFields.html: -------------------------------------------------------------------------------- 1 | 28 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Misc/ApprovalStep.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

4 | 5 |

6 |
7 |
8 |
9 |

10 |
11 |
12 | 13 | 14 | 15 | 16 | 17 |
18 | 22 |
23 |
24 |
25 |
26 |
27 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Misc/DeleteLink.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | 9 | 10 | 11 | 12 |
13 |
14 |
15 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Misc/FlashMessages.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | 5 |
6 |
{flashMessage.message}
7 |
8 |
9 |
10 |
11 |
12 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Misc/FormErrors.html: -------------------------------------------------------------------------------- 1 | 2 | PHP Validation Errormessages 3 | 4 | 5 | {namespace femanager=In2code\Femanager\ViewHelpers} 6 | 7 | 8 |
    9 | 10 | 11 |
  • 12 | 13 | 14 | 15 | If any required field in model was empty (normally username or password) 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | If given date format failed 24 | 25 | 26 | 27 | 28 | 29 | If a validator check (see TypoScript) failed 30 | 31 | : 32 | 33 | {error.message} 34 | 35 | 36 | 37 | 38 | 39 |
  • 40 |
    41 |
    42 |
43 |
44 |
45 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Misc/Pagination.html: -------------------------------------------------------------------------------- 1 | 2 | 40 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Misc/ResendConfirmation.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
    6 |
  • 7 |   8 | 9 |
  • 10 |
11 |
12 |
13 |
14 |
15 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Misc/ValidationMessages.html: -------------------------------------------------------------------------------- 1 | 2 | JavaScript Validation Errormessages 3 | 4 | 5 | 6 | {message} 7 | 8 |
9 |
-------------------------------------------------------------------------------- /Resources/Private/Partials/User/Searchform.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 | 3 |
4 | 5 |
6 | 9 |
10 | 15 |
16 |
17 | 18 |
19 |
20 | 21 |
22 |
23 |
24 |
25 |
26 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Edit/ConfirmUpdateRequest.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | User / ConfirmUpdateRequest 5 | Available variables: 6 | {user} 7 | 8 | 9 | 10 | 11 | 12 |
13 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Email/CreateAdminConfirmation.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Email / CreateAdminConfirmation 4 | 5 | This mail will be send to the admin, to confirm the new profile. 6 | It's only activated, if there is min. one email in the flexform setting for admin confirmation. 7 | 8 | Available variables: 9 | {user} User Object 10 | {hash} Hash to ensure authentication of link 11 | 12 | 13 |

14 | 15 |

16 | 17 | 18 |

19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 |

27 | 28 |

29 | 30 |
31 | 32 | 33 | 34 |

35 | 36 |

37 | 38 |
39 | 40 | 41 | 42 |

43 |
44 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Email/CreateNotify.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Email / CreateNotify 4 | 5 | This mail will be send to the admin, to inform him about a profile creation. 6 | It's only activated, if there is min. one email in the flexform setting. 7 | 8 | Available variables: 9 | {user} User Object 10 | {settings} Array with Flexform and TypoScript settings 11 | 12 | 13 |

14 | 15 |

16 | 17 | 18 | 19 |

20 | 21 |

22 | 23 | 24 |

25 | 26 |
27 | 28 | 29 | 30 |

31 | 32 |

33 | 34 |
35 | 36 | 37 | 38 |

39 |
40 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Email/CreateUserConfirmation.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Email / CreateUserConfirmation 4 | 5 | This mail will be send to the user, to confirm his new profile. 6 | It's only activated, if the user-confirm-checkbox in the flexform setting was checked. 7 | 8 | Available variables: 9 | {user} User Object 10 | {hash} Hash to ensure authentication of link 11 | 12 | 13 |

{user.username},

14 | 15 |

16 | 17 |
18 | 19 | 20 | 21 |

22 | 23 |

24 | 25 |
26 | 27 | 28 | 29 |

30 | 31 |

32 |
33 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Email/CreateUserNotify.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Email / CreateUserNotify 4 | 5 | This mail will be send to the user, to inform him about his new profile. 6 | It's always activated, even if the admin confirmation and/or the double-opt-in is activated. 7 | 8 | Available variables: 9 | {user} User Object 10 | 11 | 12 |

{user.username},

13 | 14 |

15 | 16 |

17 |
18 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Email/CreateUserNotifyRefused.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Email / CreateUserNotifyRefused 4 | 5 | This mail will be send to the user, to inform him, that his registration was refused from the admin. 6 | It's only activated, if the admin clicked the refused-profile link. 7 | 8 | Available variables: 9 | {user} User Object 10 | 11 | 12 |

{user.username},

13 | 14 |

15 | 16 |

17 |
18 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Email/Invitation.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Email / Invitation 4 | 5 | This mail will be send to the user, to confirm his new profile and set a password. 6 | It's everytime activated. 7 | 8 | Available variables: 9 | {user} User Object 10 | {hash} Hash to ensure authentication of link 11 | 12 | 13 |

{user.username},

14 | 15 |

16 | 17 |

18 | 19 |
20 | 21 | 22 | 23 |

24 | 25 |

26 | 27 |
28 | 29 | 30 | 31 |

32 | 33 |

34 |
35 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Email/InvitationNotify.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Email / InvitationNotify 4 | 5 | This mail will be send to the admin, to inform him about a profile creation. 6 | It's only activated, if there is min. one email in the flexform setting. 7 | 8 | Available variables: 9 | {user} User Object 10 | {settings} Array with Flexform and TypoScript settings 11 | 12 | 13 |

14 | 15 |

16 | 17 | 18 | 19 |

20 | 21 |

22 | 23 |
24 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Email/InvitationNotifyStep1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Email / InvitationNotify 4 | 5 | This mail will be send to the admin, to inform him about a profile creation. 6 | It's only activated, if there is min. one email in the flexform setting. 7 | 8 | Available variables: 9 | {user} User Object 10 | {settings} Array with Flexform and TypoScript settings 11 | 12 | 13 |

14 | 15 |

16 | 17 | 18 | 19 |

20 | 21 |

22 | 23 |
24 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Email/InvitationRefused.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Email / InvitationRefused 4 | 5 | This mail will be send to the admin when the user refused the profile creation. 6 | It's only activated, if there is min. one email in the flexform setting (Notify admin on step 1). 7 | 8 | Available variables: 9 | {user} User Object 10 | {settings} Array with Flexform and TypoScript settings 11 | 12 | 13 |

14 | 15 |

16 | 17 | 18 | 19 |

20 | 21 |

22 | 23 |
24 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Email/UpdateRequestRefused.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Email / UpdateRequestRefused 4 | 5 | This mail will be send to the user, to inform him about a declined profile update from the admin. 6 | It's only activated, if the admin clicks the related link in his UpdateRequest Email. 7 | 8 | Available variables: 9 | {user} User Object 10 | 11 | 12 |

{user.username},

13 | 14 |

15 | 16 |

17 | 18 | 19 | 20 |

21 | 22 |

23 | 24 |
25 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Invitation/Delete.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Invitation/Edit.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 | 3 | 4 | Invitation / Edit 5 | Available variables: 6 | {user} 7 | {hash} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 26 |
27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | -------------------------------------------------------------------------------- /Resources/Private/Templates/Invitation/Status.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Invitation / Status 4 | This view is only showed if an message should be shown to the user 5 | E.g. If the user is not allowed to do something 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Resources/Private/Templates/New/ConfirmCreateRequest.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | User / Status 4 | 5 | 6 |

User registration

7 | 8 | 9 | 10 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 |
27 |
28 | 32 |
33 |
34 |
35 |
36 |
37 |
38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /Resources/Private/Templates/New/CreateStatus.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | User / Status 4 | 5 | 6 |

User registration

7 | 8 |
9 | -------------------------------------------------------------------------------- /Resources/Private/Templates/New/ResendConfirmationDialogue.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | User / Status 4 | 5 | 6 | 7 | 8 |
9 |

10 | Resend confirmation mail 11 |

12 | 19 |
20 | 21 | 22 | 23 | 24 | 25 |
26 |
27 | 31 |
32 |
33 |
34 |
35 |
36 |
37 | -------------------------------------------------------------------------------- /Resources/Private/Templates/User/AjaxValidate.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Resources/Private/Templates/User/AjaxValidate.html -------------------------------------------------------------------------------- /Resources/Private/Templates/User/FileDelete.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | User / FileDelete 4 | 5 | 6 | {"success": true} 7 | -------------------------------------------------------------------------------- /Resources/Private/Templates/User/FileUpload.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | User / FileUpload 4 | 5 | -------------------------------------------------------------------------------- /Resources/Private/Templates/User/Validate.html: -------------------------------------------------------------------------------- 1 | {namespace femanager=In2code\Femanager\ViewHelpers} 2 | 3 | 4 | User / Validate 5 | 6 | Available variables: 7 | {isValid} Boolean value if validation was correct or not 8 | {messages} Errormessage from Validator 9 | {validation} Validation String from HTML (like "required, email, min(10)") 10 | {value} Value from field 11 | {fieldname} Fieldname (like "username") 12 | {user} User Object (only filled when used with edit action) 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Resources/Public/Css/Backend.min.css: -------------------------------------------------------------------------------- 1 | .femanager_list a.underline{text-decoration:underline}.femanager_list .cursorpointer{cursor:pointer}.femanager_list .f3-widget-paginator li{display:inline-block;padding:2px}.femanager_list .f3-widget-paginator li.current{font-weight:bold} -------------------------------------------------------------------------------- /Resources/Public/Css/Main.min.css: -------------------------------------------------------------------------------- 1 | .femanager_flashmessages>div{background-position:10px 12px;background-repeat:no-repeat;margin-bottom:4px;padding:12px 12px 12px 36px}.femanager_flashmessages>.message-2{background-color:#f6d3cf;border:1px solid #d66c68;color:#aa0225}.femanager_flashmessages>.message-1{background-color:#fbf6de;border:1px solid #b1905c;color:#9e7d4a}.femanager_flashmessages>.message-0{background-color:#cdeaca;border:1px solid #58b548;color:#3b7826}.femanager_flashmessages>.message--1{background-color:#eaf7ff;border:1px solid #c5dbe6;color:#4c73a1}.femanager_flashmessages>.message--2{background-color:#f6f7fa;border:1px solid #c2cbcf;color:#444}.femanager_note{background-position:10px 12px;background-repeat:no-repeat;margin-bottom:4px;padding:12px 12px 12px 36px;background-color:#f6f7fa;border:1px solid #c2cbcf;color:#444;list-style-type:none;margin-left:0}.femanager_error{background-position:10px 12px;background-repeat:no-repeat;margin-bottom:4px;padding:12px 12px 12px 36px;background-color:#f6d3cf;border:1px solid #d66c68;color:#aa0225;list-style-type:none;margin-left:0} -------------------------------------------------------------------------------- /Resources/Public/Icons/Extension.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | -------------------------------------------------------------------------------- /Resources/Public/Icons/Log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Resources/Public/Icons/Log.png -------------------------------------------------------------------------------- /Resources/Public/Icons/relation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in2code-de/femanager/261d0fc52585710528fcc52679ce3f4c28926b4e/Resources/Public/Icons/relation.gif -------------------------------------------------------------------------------- /Resources/Public/JavaScript/Backend.min.js: -------------------------------------------------------------------------------- 1 | define(["jquery"],function(e){e(document).ready(function(e){e(".hideUser, .unhideUser").click(function(){var s=e(this),t=s.siblings(".container_module_uri").val(),i=s.siblings(".container_uid").val(),n=s.siblings(".container_table").val();if(s.hasClass("hideUser")){s.closest("tr").find(".tx-feusermanager-icon-status-user-frontend").hide(),s.closest("tr").find(".tx-feusermanager-icon-status-user-frontend-disabled").show(),s.closest("tr").find(".tx-feusermanager-icon-actions-edit-hide").hide(),s.closest("tr").find(".tx-feusermanager-icon-actions-edit-unhide").show(),s.closest("tr").find(".tx-feusermanager-icon-actions-system-backend-user-switch").hide(),s.closest("tr").find(".tx-feusermanager-icon-actions-system-backend-user-switch-disabled").show();var a=1}else{s.closest("tr").find(".tx-feusermanager-icon-status-user-frontend").show(),s.closest("tr").find(".tx-feusermanager-icon-status-user-frontend-disabled").hide(),s.closest("tr").find(".tx-feusermanager-icon-actions-edit-hide").show(),s.closest("tr").find(".tx-feusermanager-icon-actions-edit-unhide").hide(),s.closest("tr").find(".tx-feusermanager-icon-actions-system-backend-user-switch").show(),s.closest("tr").find(".tx-feusermanager-icon-actions-system-backend-user-switch-disabled").hide();var a=0}url=t+"&data["+n+"]["+i+"][disable]="+a,e.ajax({url:url})}),e(".deleteUser").click(function(){var s=e(this),t=s.siblings(".container_module_uri").val(),i=s.siblings(".container_uid").val(),n=s.siblings(".container_table").val(),a=s.siblings(".container_label_delete_confirmation").val();if(confirm(a)){s.closest("tr").fadeOut("fast");var r=t+"&cmd["+n+"]["+i+"][delete]=1";e.ajax({url:r})}}),e(".logoutUser").click(function(s){s.preventDefault();var t=e(this);t.closest("tr").find(".tx-feusermanager-icon-status-status-permission-granted").hide(),t.closest("tr").find(".tx-feusermanager-icon-status-status-permission-denied").show(),t.closest("tr").find(".tx-feusermanager-icon-actions-system-backend-user-switch-disabled").hide(),t.closest("tr").find(".tx-feusermanager-icon-actions-system-backend-user-switch").show(),t.closest("tr").find(".tx-feusermanager-icon-apps-pagetree-drag-place-denied").hide(),t.closest("tr").find(".tx-feusermanager-icon-apps-pagetree-drag-place-denied-disabled").show();var i=t.prop("href");e.ajax({url:i})})})}); -------------------------------------------------------------------------------- /Resources/Public/JavaScript/Data.min.js: -------------------------------------------------------------------------------- 1 | jQuery.fn.femanagerData=function(e){function a(a){requestCallback=new d({numRequest:a.find("*[data-validation]").length,element:a}),a.find("*[data-validation]").each(function(){t(e(this),!0)})}function t(a,t){var o=a.closest("form"),c=o.find("div:first").find('input[name="tx_femanager_pi1[user][__identity]"]').val(),d=o.find("div:first").find('input[name="tx_femanager_pi1[__referrer][@action]"]').val(),p=Femanager.getBaseUrl()+"?id="+e("#femanagerPid").val()+"&type=1548935210",m=s(a),g=a.val();"checkbox"==a.prop("type")&&0==a.prop("checked")&&(g="");var v="";if(l(m,"sameAs")){var h=l(m,"sameAs"),_=f(h),b=e('input[name="tx_femanager_pi1[user]['+_+']"]');v=b.val(),"checkbox"==b.prop("type")&&0==b.prop("checked")&&(v="")}e.ajax({url:p,data:{"tx_femanager_pi1[validation]":a.attr("data-validation"),"tx_femanager_pi1[value]":g,"tx_femanager_pi1[field]":r(a),"tx_femanager_pi1[user]":void 0!==c?c:"","tx_femanager_pi1[additionalValue]":v?v:"","tx_femanager_pi1[plugin]":o.data("femanager-plugin"),"tx_femanager_pi1[referrerAction]":d,storagePid:e("#femanagerStoragePid").val(),L:e("#femanagerLanguage").val(),id:e("#femanagerPid").val()},type:"POST",cache:!1,success:function(e){if(t&&requestCallback.addCallbackToQueue(!0),e)try{e.validate?i(a):n(a,e.message)}catch(r){a.before(data)}},error:function(){u()}})}function r(e){var a="",t=e.prop("name").split("[");return a=void 0!==t[2]?t[2].replace("]",""):t[1].replace("]","")}function n(a,t){i(a);var r=e(".femanager_validation_container").html().replace("###messages###",t);a.before(r),a.closest(".form-group").addClass("has-error"),a.addClass("error")}function i(e){e.closest(".form-group").removeClass("has-error"),e.siblings(".alert").remove(),e.removeClass("error")}function o(a){0==a.find(".error").length?(submitFormAllowed=!0,a.submit()):e("html,body").animate({scrollTop:a.find(".error:first").offset().top})}function l(e,a){for(var t=0;t 'femanager', 9 | 'description' => 'TYPO3 Frontend User Registration and Management based on 10 | Extbase and Fluid and on TYPO3 12 and the possibility to extend it.', 11 | 'category' => 'plugin', 12 | 'author' => 'Alexander Kellner, Stefan Busemann, Daniel Hoffmann', 13 | 'author_email' => 'info@in2code.de', 14 | 'author_company' => 'in2code.de - Wir leben TYPO3', 15 | 'state' => 'stable', 16 | 'version' => '8.3.0', 17 | 'constraints' => [ 18 | 'depends' => [ 19 | 'typo3' => '12.0.0-12.4.99', 20 | 'php' => '8.1.0-', 21 | ], 22 | 'conflicts' => [], 23 | 'suggests' => [ 24 | 'sr_freecap' => '2.3.0-2.99.99', 25 | 'static_info_tables' => '6.9.0-6.99.99', 26 | ], 27 | ], 28 | 'autoload' => [ 29 | 'psr-4' => [ 30 | 'In2code\\Femanager\\' => 'Classes' 31 | ] 32 | ], 33 | ]; 34 | -------------------------------------------------------------------------------- /ext_tables.php: -------------------------------------------------------------------------------- 1 | ' 12 | ); 13 | }); 14 | -------------------------------------------------------------------------------- /ext_tables.sql: -------------------------------------------------------------------------------- 1 | # 2 | # Table structure for table 'fe_users' 3 | # 4 | CREATE TABLE fe_users ( 5 | gender int(11) unsigned DEFAULT '0' NOT NULL, 6 | date_of_birth int(11) DEFAULT '0' NOT NULL, 7 | tx_femanager_confirmedbyuser tinyint(3) DEFAULT '0' NOT NULL, 8 | tx_femanager_confirmedbyadmin tinyint(3) DEFAULT '0' NOT NULL, 9 | tx_femanager_log int(11) DEFAULT '0' NOT NULL, 10 | tx_femanager_changerequest text, 11 | tx_femanager_terms tinyint(3) DEFAULT '0' NOT NULL, 12 | tx_femanager_terms_date_of_acceptance INT(11) DEFAULT '0' NOT NULL, 13 | state varchar(255) DEFAULT '' NOT NULL 14 | ); 15 | 16 | # 17 | # Table structure for table 'tx_femanager_domain_model_log' 18 | # 19 | CREATE TABLE tx_femanager_domain_model_log ( 20 | uid int(11) NOT NULL auto_increment, 21 | pid int(11) DEFAULT '0' NOT NULL, 22 | 23 | user int(11) unsigned DEFAULT '0' NOT NULL, 24 | 25 | title varchar(255) DEFAULT '' NOT NULL, 26 | state int(11) unsigned DEFAULT '0' NOT NULL, 27 | 28 | tstamp int(11) unsigned DEFAULT '0' NOT NULL, 29 | crdate int(11) unsigned DEFAULT '0' NOT NULL, 30 | cruser_id int(11) unsigned DEFAULT '0' NOT NULL, 31 | deleted tinyint(4) unsigned DEFAULT '0' NOT NULL, 32 | hidden tinyint(4) unsigned DEFAULT '0' NOT NULL, 33 | starttime int(11) unsigned DEFAULT '0' NOT NULL, 34 | endtime int(11) unsigned DEFAULT '0' NOT NULL, 35 | 36 | t3ver_oid int(11) DEFAULT '0' NOT NULL, 37 | t3ver_id int(11) DEFAULT '0' NOT NULL, 38 | t3ver_wsid int(11) DEFAULT '0' NOT NULL, 39 | t3ver_label varchar(255) DEFAULT '' NOT NULL, 40 | t3ver_state tinyint(4) DEFAULT '0' NOT NULL, 41 | t3ver_stage int(11) DEFAULT '0' NOT NULL, 42 | t3ver_count int(11) DEFAULT '0' NOT NULL, 43 | t3ver_tstamp int(11) DEFAULT '0' NOT NULL, 44 | t3ver_move_id int(11) DEFAULT '0' NOT NULL, 45 | 46 | t3_origuid int(11) DEFAULT '0' NOT NULL, 47 | sys_language_uid int(11) DEFAULT '0' NOT NULL, 48 | l10n_parent int(11) DEFAULT '0' NOT NULL, 49 | l10n_diffsource mediumblob, 50 | 51 | PRIMARY KEY (uid), 52 | KEY parent (pid), 53 | KEY t3ver_oid (t3ver_oid,t3ver_wsid), 54 | KEY language (l10n_parent,sys_language_uid) 55 | ); 56 | -------------------------------------------------------------------------------- /ext_typoscript_setup.typoscript: -------------------------------------------------------------------------------- 1 | # Backend Module 2 | module.tx_femanager { 3 | view { 4 | templateRootPaths.0 = EXT:femanager/Resources/Private/Templates/ 5 | partialRootPaths.0 = EXT:femanager/Resources/Private/Partials/ 6 | layoutRootPaths.0 = EXT:femanager/Resources/Private/Layouts/ 7 | } 8 | } 9 | 10 | ########################################################## 11 | # Page for backend module Login as function (impersonate) 12 | ########################################################## 13 | feManagerLoginAs = PAGE 14 | feManagerLoginAs { 15 | typeNum = 1548943013 16 | config { 17 | no_cache = 1 18 | #disableAllHeaderCode = 1 19 | #disablePrefixComment = 1 20 | xhtml_cleaning = 0 21 | admPanel = 0 22 | debug = 0 23 | } 24 | 10 = USER 25 | 10 { 26 | userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run 27 | extensionName = Femanager 28 | pluginName = Impersonate 29 | vendorName = In2code 30 | controller = User 31 | action = loginAs 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /phive.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | --------------------------------------------------------------------------------